我想第一次使用多对多关系,最初我有四个一对多关系,所有信息都以索引形式显示。然后我决定将办公室表写成多对多和任务表,所以我更改了代码如下:
数据透视表迁移:
public function up()
{
Schema::create('office_task', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('office_id');
$table->foreign('office_id')->references('id')->on('offices')->onUpdate('cascade')->onDelete('cascade');
$table->unsignedBigInteger('task_id');
$table->foreign('task_id')->references('id')->on('tasks')->onUpdate('cascade')->onDelete('cascade');
$table->timestamps();
});
}
在任务模型中:
public function Office(): BelongsToMany
{
// return $this->belongsTo(Office::class, 'office_id');
return $this->belongsToMany(Office::class);
}
办公室模型:
public function tasks(): BelongsToMany
{
// return $this->hasMany(Task::class,'office_id');
return $this->belongsToMany(Task::class);
}
在具有三个一对多和一个多对多关系的控制器中:
public function index()
{
$tasks = Task::where('type', 0)
->with(['Office', 'Commander', 'Status', 'Priority'])
->Sortable()
->paginate(8);
return view('taskmanager.tasks.index',compact('tasks'));
}
并以索引形式(视图):
@foreach($tasks as $item)
<tr>
<td>{{$item->id}}</td>
<td>{{$item->Caption}}</td>
<td>{{$item->Commander->Desc}}</td>
<td>{{$item->Priority->Desc}}</td>
<td>{{$item->Status->Desc}}</td>
<td>{{$item->office->caption}}</td> //line with error
<td>
</tr>
@endforeach
但在
{{$item->office->caption}}
行中我收到错误:此集合实例上不存在属性[标题]。
正如我之前所说,我在一对多模式下没有这个错误,我该如何编辑并运行它?
belongsToMany
关系对模型之间的多对多链接进行建模。这意味着您的 Task
可以有很多办公室,并且您的 Office
有很多任务,这意味着现在这些关系无论如何都会返回一组项目。如果这就是您真正想要的,那么您还需要将 Task
中的关系从 Office()
重命名为 Offices()
。要打印所有相关办公室的标题,您可以使用 $item->Offices->implode('caption', ', ')
。