نوب
3 سال پیش توسط نوب مطرح شد
5 پاسخ

تحلیل یک رابطه در لاراول

سلام دوستان
یه سوال

جدول users دارم با ستونهای زیر

Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('is_admin')->default('no');
            $table->string('role')->default('user');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });

2 نوع کاربر توی سایت داریم
کاربر عادی که با کلمه user نمایش داده میشه و نمایندگان با کلمه admin نمایش داده میشه که از ستونrole گرفته میشه

میخوام توی سایت کاربران مربوط به هر نماینده را نشون بدم و بگیرم
جدول رابطش به چه صورت میشه با توجه به اینکه رابطه بین نماینده و کاربران هردوتاشون توی جدول users هست

میخواتم یه جول بزنم به اسم admin_user که بعدش دیدم قاعدتا باید یه ستون user_id داشته باشم و یه ستون admin_id ولی خب جدول admin نداریم که . چیکار کنم :))

@mohaligateway
@ali.bayat


ثبت پرسش جدید
علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
0

باید بین جدول user و جدول های Role & Permission یه سری رابطه ایجاد کنی
پکیج های آماده این رابطه رو دارند
بعد میتونی اون رابطه رو روی مدل User اعمال کنی
مثال

    use Illuminate\Database\Eloquent\Builder;

    User::with('roles')
        ->whereHas('roles', function(Builder $builder) {
            return $builder->where('name', 'admin');
        })->get();

مثلا به این ترتیب میتونی

  • کاربرها رو با رابطه roles ایگرلود کنی
  • بعد چک کنی اگر اون کاربرها رابطه ای با رول دارند
  • اگر دارند و اسم اون role هم ادمین هست
  • لیستشون رو برگردونی

میتونی همچین نوعی از چک کردن رو روی role های دیگه هم اجرا کنی


moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 3 سال پیش مطرح شد
0

سلام
بهتر هست به جای is_admin ستون privillage قرار بدید و داخلش Role کاربران رو قرار بدید. باید از رابطه های role و permission استفاده کنید. به صورتی که هر کاربر دارای یک Role است که در یک جدول many to many قرار می گیرد.
@yk5742g


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
0

میتونی خودت به صورت دستی جداول دیگه بوجود بیاری مثلا نماینده و مدیر
و در عین حال میتونی از سیستم ACL هم استفاده کنی
پکیج spatie permission گزینه خوبی هست


نوب
تخصص : کدنویس نوب :)
@yk5742g 3 سال پیش مطرح شد
0

@ali.bayat @mohaligateway
درود دوستان
ممنونم از اینکه همیشه ما را راهنمایی میکنین :)

من یه سیستم ACL کامل نوشتم با اسم جداول permissions و roles و جداول واسط که به کاربران دسترسی های مختلف برای بخش های مختلف سایت را بدم
ولی میخواستم یه چیزی راه بندازم مثل مثال زیر
فرض کنین هر نوشته چند دسته بندی داره و هر دسته بندی مربوطه به چند نوشته هست
حالا ما جداول زیر را داریم
posts
category
category_post
خب توی جدول سوم ستونهای post_id و category_id داریم
اینطوری میتونیم راحت رابطه را برقرار کنیم

ولی برای اون مبحث کاربران چون هر دو نوع کاربر توی جدول users هستن نمیشه این روش را پیاده کرد
راه حل بهتری دارید ؟


moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 3 سال پیش مطرح شد
0

برای برقرار کردن ارتباط many to many شما باید یک جدول ایجاد کنید به نام permission_role که ارتباط بین permission و Role رو داشته باشه. و یک جدول هم به نام role_user که از id های role و user تشکیل شده است.
@yk5742g


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
0

باید بین جدول user و جدول های Role & Permission یه سری رابطه ایجاد کنی
پکیج های آماده این رابطه رو دارند
بعد میتونی اون رابطه رو روی مدل User اعمال کنی
مثال

    use Illuminate\Database\Eloquent\Builder;

    User::with('roles')
        ->whereHas('roles', function(Builder $builder) {
            return $builder->where('name', 'admin');
        })->get();

مثلا به این ترتیب میتونی

  • کاربرها رو با رابطه roles ایگرلود کنی
  • بعد چک کنی اگر اون کاربرها رابطه ای با رول دارند
  • اگر دارند و اسم اون role هم ادمین هست
  • لیستشون رو برگردونی

میتونی همچین نوعی از چک کردن رو روی role های دیگه هم اجرا کنی


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

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