فراز بنی آدم
2 سال پیش توسط فراز بنی آدم مطرح شد
6 پاسخ

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

سلام وقت بخیر
من سه تا جدول به این صورت دارم
user
shift
location
میخوام یک جدول میانی داشته باشم که id این سه تا جدول + یک ستون دیگه به نام روز را نگهداری کنه.
یعنی یک کاربر در تاریخ فلان در شیفت صبح در بخش A مشغول به کاره
این جدول میانی منه

 Schema::create('shift_user', function(Blueprint $table) {
            $table->id();
            $table->bigInteger('location_id')->unsigned();
            $table->bigInteger('shift_id')->unsigned();
            $table->bigInteger('user_id')->unsigned();
            $table->date('day');

            $table->unique(['location_id', 'shift_id', 'user_id', 'day']);
        });

این هم مدل user

    public function shift()
    {
        return $this->belongsToMany(Shift::class);
    }

    public function location()
    {
        return $this->belongsToMany(Location::class);
    }

مدل location

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

    public function shift()
    {
        return $this->belongsToMany(Shift::class);
    }

و مدل shift

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

    public function location()
    {
        return $this->belongsToMany(Location::class);
    }

این هم دستوری هست که اطلاعات را وارد دیتابیس میکنم

$shift->user()->attach($userid, ['location_id' => $location, 'day' => $day]);

از طریق دستور attach تونستم اطلاعات را داخل دیتابیس insert کنم ولی موقع فراخوانی به مشکل خوردم و هر کاری میکنم یک اروری میده و نمیتونم متوجه بشم که چطوری میتونم اطلاعات را بخونم.
الان میخوام اولا بر اساس شیفتی که توی روز خاص داره اجازه لاگین بدم بهش که اگر کلا اون روز و توی اون شیفت چیزی براش تعریف نشده بود نتونه وارد بشه که با middleware به راحتی میشه این رو انجام داد (البته زمانی که بفهمم چطوری میتونم اطلاعات را فراخوانی کنم 😁)
دوما اگر وارد شد میخوام براش نمایش بدم که شما امروز به این بخش ها دسترسی داری
وقتی این را فراخوانی میکنم با توجه به تعریف نام جدول اطلاعات را نمایش میده

$shifts = $user->shift()->get();

ولی وقتی این رو میزنم

$locations = $user->location()->get();

این ارور میده

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'lar_trakpak.location_user' doesn't exist (SQL: select `locations`.*, `location_user`.`user_id` as `pivot_user_id`, `location_user`.`location_id` as `pivot_location_id` from `locations` inner join `location_user` on `locations`.`id` = `location_user`.`location_id` where `location_user`.`user_id` = 1) 

این رو هم چک کردم

$locations = $user->shift()->location()->get();

ولی این ارور را دریافت کردم

Call to undefined method Illuminate\Database\Eloquent\Relations\BelongsToMany::location() 

لطفا بنده را راهنمایی بفرمائید
با تشکر


ثبت پرسش جدید
امین محمدزاده
تخصص : برنامه نویسی وب - Laravel
@amin.webdesign 2 سال پیش مطرح شد
0

سلام. خطای به این سادگی بهتون داره میگه جدول location_user یافت نشد.


فراز بنی آدم
@Pharax 2 سال پیش مطرح شد
0

@amin.webdesign
میدونم این را داره میگه! راه حلش چیه؟
نمیخوام یک جدول دیگه درست کنم! چطوری میتونم از این جدول اطلاعات را بگیرم؟


امین محمدزاده
تخصص : برنامه نویسی وب - Laravel
@amin.webdesign 2 سال پیش مطرح شد
0

سلام
شما اول باید با روابط لاراول کامل آشنا باشید تا بتونید مشکلتون رو حل کنید. یه لینک بهت میدم اونجا ماهیگیری رو یاد بگیر
دیتی - آموزش روابط لاراول


فراز بنی آدم
@Pharax 2 سال پیش مطرح شد
0

@amin.webdesign
خیلی ممنون از راهنماییت ولی فکر کنم اصلا شما متوجه مشکل من نشدید (شاید هم من متوجه نمیشم شما چی میگی 🧐).
من مشکلم با ساخت جدول میانی نیست و ساختار جدول من شامل هیچکدام از موارد روتین رابطه‌ها نمیشه. مشکلم با جدول میانی برای سه جدوله که تمامی حالات براش امکان پذیره. من کلا راهی نتونستم پیدا کنم که با eloquent اینکار را انجام بدم و میخواستم بدونم راهی هست یا اینکه باید حتما از query builder استفاده کنم؟


ناصر احدی
تخصص : مهندس نرم افزار
@nasser0ahadi 2 سال پیش مطرح شد
0

سلام وقت بخیر به این لینک سر بزنید:
https://medium.com/@kaism/3-way-pivot-table-in-laravel-d42d60462b06


Ermia
تخصص : توسعه دهنده وب فول استک + سیست...
@MakaveliDon 2 سال پیش مطرح شد
0

دررابطه با many through
یا تابع hasManyThrough خود لاراول بخونید


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

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