Ad

Making Model Relationship To User, User Can Only Access Its Own Data

i have 2 main models and some child models with relationController to main models, now i need to add user id to both main and child models so user can only access its own data since users data stay on the same table. i create belongsToMany relationship from user.php to the models and vice versa with pivot table but nothing happen i have no idea how to do this since i need simplified database management in case i need to do migration.. can someone share your experience on this..

Ad

Answer

I can suggest you that you just add user_id [for Backend =>backend_users_id ] to models which data you want access to owner only.

now in main model you can define belongsTo relation and in user you can define hasMany relation

main model relationship [if you want to restrict the user in backend side then you need to add backend user relation and same in backend user model]

class MainModel extends Model
{
    // Adding relation to user model
    public $belongsTo = [
        'user' => 'RainLab\User\Models\User',
        'backend_users' =>'Backend\Models\User' // for Backend
    ];

}

adding a relation to the user model [ you need to put this code in your plugin's boot method ]

// Extending User Model
\RainLab\User\Models\User::extend(function($model) {
    $model->hasMany['mainmodel'] = ['HardikSatasiya\Plugin\Models\MainModel'];
});

// for Backend users
\Backend\Models\User::extend(function($model) {
    $model->hasMany['mainmodel'] = ['HardikSatasiya\Plugin\Models\MainModel'];
});

Now access data [ Front-end side ]

// Returns the signed in user
$user = \Auth::getUser();
dd($user->mainmodel); // it will return collection of related mainmodels

// it will return related data and now its filter by owner
dd($user->mainmodel[0]->otherRelatin); 


// for Backend users
// Returns the signed in user
$user = \BackendAuth::getUser();
dd($user->mainmodel); // it will return collection of related mainmodels

// it will return related data and now its filter by owner
dd($user->mainmodel[0]->otherRelatin); 

Example filter data in listview based on logged in admin user [ OctoberCMS do not give such functionality out of the box, you can not hide a portion of data records you can hide entire menu or all records based on rights and roles but can not hide partial records ]

public function listExtendQuery($query)
{
    $user = \BackendAuth::getUser();
    $query->where('backend_users_id', $user->id);
}

to add backend_users_id you can use this code

class MainModel extends Model {

    public function beforeSave()
    {
        $user = \BackendAuth::getUser();
        $this->backend_users_id = $user->id;
    }
}

if any doubt please comment.

Ad
source: stackoverflow.com
Ad