我有一部电影,一部电影可以有一个或两个性别。 性别来自另一张桌子。
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>
如果电影中有两个性别,也叫第二个;
类似于“玩具大战”的动画和冒险冒险
答案 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');
}