我已经有一段时间没有与Laravel合作了,现在我正试图回过头来从事一个项目,但我感到困惑的是要通过一对多关系检索数据。
在用户模型中:
public function blackboard()
{
return $this->hasMany(Blackboard::class);
}
在黑板模型中:
public function user()
{
return $this->belongsTo(User::class);
}
在控制器中:
public function index()
{
$blackboard = Blackboard::all();
return view('home', ['blackboards' => $blackboard]);
}
在视图中:
<ul class="list-group">
@foreach($blackboards as $blackboard)
<li>{{ $blackboard->user->name }}</li>
@endforeach
</ul>
在黑板上迁移:
Schema::create('blackboards', function (Blueprint $table)
{
$table->bigIncrements('id');
$table->text('title')->nullable(); //Need to take out
$table->text('content')->nullable(); //Need to take out
$table->unsignedBigInteger('created_by');
$table->timestamps();
$table->foreign('created_by')
->references('id')
->on('users')
->onDelete('cascade');
});
在用户迁移中
Schema::create('users', function (Blueprint $table)
{
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
以某种方式,它不允许我通过黑板数据显示用户信息,但出现以下错误:
Trying to get property 'name' of non-object (View: /var/www/html/intranet/resources/views/home.blade.php)
答案 0 :(得分:0)
我认为您要做的就是提供外键名称,只有遵循laravel约定(如果您将其命名为user_id),您才可以忽略它:
在用户模型中:
public function blackboard(){
return $this->hasMany(Blackboard::class,'created_by');
}
在黑板模型中:
public function user(){
return $this->belongsTo(User::class,'created_by');
}
答案 1 :(得分:0)
Blackboard
内部模型:
public function user()
{
return $this->belongsTo(User::class, 'created_by', 'id');
}
如果您也想使反向关系正常工作,请在User
模式下:
public function blackboard()
{
return $this->hasMany(Blackboard::class, 'created_by', 'id');
}
别忘了在访问视图之前在Controller中加载用户,这将提高性能:
public function index()
{
$blackboard = Blackboard::with(['user'])->get();
return view('home', ['blackboards' => $blackboard]);
}