如何多次使用相同的外键

时间:2019-08-18 06:40:47

标签: php laravel foreign-keys

我有一部电影,一部电影可以有一个或两个性别。 性别来自另一张桌子。

Laravel抛出了这两个错误(显然,第二个关系不会创建带有性别标题的对象关系)

  fdc637007ae29076d303671b0f7f6c5282ce835a.php行中的

ErrorException   42:尝试获取非对象的属性(查看:   C:\ laragon \ www \ testeAtlas \ testeAtlas2019 \ resources \ views \ pages \ show-movie.blade.php)

     fdc637007ae29076d303671b0f7f6c5282ce835a.php行中的

ErrorException   42:试图获取非对象的属性

迁移: 电影表创建

public function up()
    {
        Schema::create('movies', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('users');
            $table->integer('gender_id')->unsigned();
            $table->foreign('gender_id')->references('id')->on('genders');
            $table->string('title');
            $table->string('slug');
            $table->string('description');
            $table->integer('year')->unsigned();
            $table->timestamps();
        });
    }

电影添加了第二性别选项

Schema::table('movies', function ($table) {
            $table->integer('secondgender_id')->unsigned()->nullable();
            $table->foreign('secondgender_id')->references('id')->on('genders');
        });

性别表

Schema::create('genders', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->timestamps();
        });

型号: 电影模特

class Movie extends Model
{

    use SoftDeletes;

    public function user()
    {
        return $this->belongsTo('App\User');
    }

    public function gender()
    {
        return $this->belongsTo('App\Gender');
    } 

    public function secondGender()
    {

        // dd("inicio");
        return $this->belongsTo('App\Gender');
    } 

    //protected $dates = ['deleted_at'];
}

性别模型

class Gender extends Model
{
    public function movies()
    {
        return $this->hasMany('App\Movie', 'gender_id', 'secondgender_id');
    }
}

查看:

                        {{-- Call the first gender --}}
                        <span> Genêro: {{ $movie->gender->title }}</span>

                        {{-- If movie have an second Gender... --}}
                        @if ($movie->secondgender_id)
                           <br>
                           <span> Genêro Secundário: {{ $movie->secondGender->title }}</span>
                        <br>
                        @endif                   
                        <span> Duração: {{ $movie->lenght }} min.</span>

如果电影中有两个性别,也叫第二个;

类似于“玩具大战”的动画和冒险冒险

1 个答案:

答案 0 :(得分:1)

由于您将secondGender()作为关系名称编写,因此Laravel希望该列被称为second_gender_id。由于您的列称为secondgender_id,您只需要将此不同的名称作为第二个参数传递给您的关系定义:

public function secondGender()
{
    return $this->belongsTo('App\Gender', 'secondgender_id');
}

我的建议是始终将所有参数传递给关系定义,因为这会使它们更明确,并且不会隐藏Laravel魔术。它还可以帮助新开发人员更快地适应,因为这很明显正在发生的事情。换句话说,我什至会传递第三个参数(外部表的键列):

public function secondGender()
{
    return $this->belongsTo('App\Gender', 'secondgender_id', 'id');
}