Soh3illl
4 سال پیش توسط Soh3illl مطرح شد
3 پاسخ

مشکل در رابطه ی many to many

سلام به همگی دوستان.
من داخل فایل web.php یه روت رو به شکل زیر تعریف کردم .

Route::get('/test' , function (){
    $user = auth()->user();
//    return $user;
    $role = $user->roles;
//    return $role;
    $permission = $role->permission;
    return $permission;
});

وقتی user و role رو return می کنم اطلاعتشون به صورت کامل بر میگرده. ولی وقتی permission رو return می کنم. اررور زیر رو نمایش میده.

 Property [permission] does not exist on this collection instance. 

این کد های مربوط به مایگریشنم.

public function up()
    {
        Schema::create('permissions', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('title');
            $table->timestamps();
        });
        Schema::create('permission_role', function (Blueprint $table) {
            $table->id();
            $table->foreignId('role_id');
            $table->foreignId('permission_id');
            $table->timestamps();
        });
        Schema::create('roles', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('title');
            $table->timestamps();
        });
        Schema::create('role_user', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id');
            $table->foreignId('role_id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('permissions');
        Schema::dropIfExists('permission_role');
        Schema::dropIfExists('roles');
        Schema::dropIfExists('role_user');
    }

کدهای مربوط به مدل User

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function articles()
    {
        return $this->hasMany(Article::class);
    }

    public function courses()
    {
        return $this->hasMany(Course::class);
    }

    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }

کدهای مربوط به مدل Role

class Role extends Model
{
//    protected $guarded = [];

    public function users()
    {
        return $this->belongsToMany(User::class);
    }

    public function permissions()
    {
        return $this->belongsToMany(Permission::class , 'permission_role' , 'permission_id');
    }
}

کدهای مربوط به مدل Permission :

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Permission extends Model
{
    public function roles()
    {
        return $this->belongsToMany(Role::class , 'permission_role' , 'role_id');
    }
}

ثبت پرسش جدید
وحید حسنی
تخصص : برنامه نویس وب
@vah.id 4 سال پیش مطرح شد
1

@Ali.Abbasi1381
دوست عزیز شما در قسمت زیر یک آرایه از Role ها رو دریافت میکنید پس مستقیما نمیتونید به Permissions های اون Role دسترسی داشته باشید.

$role = $user->roles;

اگر دقت کنید اسم تابع هم Roles عه که یعنی "role های" مربوط به هر کاربر
شما میتونید با کد زیر تقریبا به Permission های هر Role دسترسی داشته باشید.

$roles = $user->roles;
foreach($roles as $role){
   $p = $role->permissions;
}

woz
تخصص : fan of open source world
@wozniak 4 سال پیش آپدیت شد
0

@Ali.Abbasi1381
ظاهرا هر یوزر شما چندین رول داره، یا یک رول داره و چون ارتباط چندگانه هست array بر میگردونه . یعنی کد زیر شما collection بر میگردونه :

    $role = $user->roles;

پس در این قسمت باید یک role انتخاب کرده و permissions های اون رو بگیرید. و یا از relation های بین role - permission استفاده کنید :

    $permission = $role[0]->permission;
    return $permission;

Soh3illl
تخصص : برنامه نویس php
@soh3illl 4 سال پیش مطرح شد
0

@wozniak
@vah.id
سلام.
ممنون از لطفتون.
متوجه اشتباه شدم.


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام