如何在laravel中获取多对多关系的数据

问题描述 投票:0回答:1

我想第一次使用多对多关系,最初我有四个一对多关系,所有信息都以索引形式显示。然后我决定将办公室表写成多对多和任务表,所以我更改了代码如下:

数据透视表迁移:

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}}
行中我收到错误:此集合实例上不存在属性[标题]。 正如我之前所说,我在一对多模式下没有这个错误,我该如何编辑并运行它?

laravel
1个回答
0
投票

belongsToMany
关系对模型之间的多对多链接进行建模。这意味着您的
Task
可以有很多办公室,并且您的
Office
有很多任务,这意味着现在这些关系无论如何都会返回一组项目。如果这就是您真正想要的,那么您还需要将
Task
中的关系从
Office()
重命名为
Offices()
。要打印所有相关办公室的标题,您可以使用
$item->Offices->implode('caption', ', ')

© www.soinside.com 2019 - 2024. All rights reserved.