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

خطا هنگام ارتباط چند به چند در لاراول

سلام من موقع استفاده از رابطه چند به چند بین Role و Karbar به خطای زیر میخورم

LogicException
App\Models\Karbar::roles must return a relationship instance, but "null" was returned. Was the "return" keyword used? 

این از مدل role

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
    use HasFactory;
    public function karbars()
    {
        $this->belongsToMany(Karbar::class);
    }
}

مدل karbar

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Karbar extends Model
{
    use HasFactory;
    public function roles()
    {
        $this->belongsToMany(Role::class);
    }
}

اینم از روت

 Route::get('karbar/role', function () {

      $role_karbar=Role::find(2)->karbars;
      echo $role_karbar->name;
 });

ممنون میشم کمک کنید دوستان.


ثبت پرسش جدید
محمد امیری
تخصص : backend coder
@mohammadeng3731 3 سال پیش آپدیت شد
0

سلام.
یک رابطه باید مقدار برگردونه ولی متاسفانه مقدار رو شما return نکردید.یعنی به شکل زیر

‍‍‍```
return $this->belongsToMany(Role::class);


سهیل حیدری
@hbr 3 سال پیش مطرح شد
0

@mirzamohammad.com
سلام من از لارول چیزه زیادی نمیدونم ولی برای رابطه چند به چند بین دو جدول نیاز به جدول سومی هم دارید که رابطه های بین دو جدول رو ذخیره کنه.


محمد میرزاخانی
@mirzamohammad.com 3 سال پیش مطرح شد
0

@hbr
اینم از جدول واسط

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateKarbarRoleTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('karbar_role', function (Blueprint $table) {
            $table->id();
            $table->string('karbar_id');
            $table->string('role_id');
            $table->timestamps();
        });
    }

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

رضا جهانگیر
تخصص : Full-Stack Developer
@rezajahangir 3 سال پیش مطرح شد
-1

سلام به شما دوست عزیز.
به صورت زیر بنویسید:

 Route::get('karbar/role', function () {

      $role_karbar=Role::karbars()->find(2);
      echo $role_karbar->name;
 });

موفق باشید.


محمد میرزاخانی
@mirzamohammad.com 3 سال پیش مطرح شد
0

@rezajahangir
بعید میدونم روتم مشکل داشته باشه
حالا من چیزیم که شما گفتیدا امتحان کردم و خطای زیرا گرفتم

Non-static method App\Models\Role::karbars() cannot be called statically

فرشید مرادی
تخصص : noob
@eniack 3 سال پیش آپدیت شد
0

سلام وقت بخیر ،
مشکل شما از جدول واسط هست ،
یک مورد رو خیلی بی دقتی کردید شما id هارو از نوع string تعریف کردید!!!
اما تعریف رابطه داخل جدول واسط باید به این نوع نوشته بشه :

Schema::create('permission_user' , function(Blueprint $table) {
            $table->unsignedBigInteger('permission_id');
            $table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');
            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->primary(['permission_id' , 'user_id']);
        });

داخل این مثال جدول user و permission باهم ارتباط چند به چند دارن ابتدا گفته شده نوعش عددی هست در خط بعدش گفته شده id جدول مورد نظر که users یا permissions هست باهم ارتباط دارن و اگر یکی از دیتاها پاک شود داخل جدول دیگر هم پاک میشه و رکورد های تکراری هم نداریم داخل دیتابیس


محمد امیری
تخصص : backend coder
@mohammadeng3731 3 سال پیش آپدیت شد
0

سلام.
یک رابطه باید مقدار برگردونه ولی متاسفانه مقدار رو شما return نکردید.یعنی به شکل زیر

‍‍‍```
return $this->belongsToMany(Role::class);


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

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