【问题标题】:call relation in Pivot model枢轴模型中的调用关系
【发布时间】:2019-05-17 16:56:34
【问题描述】:

我尝试加载关系,例如:

 return $task->load('users', 'creator', 'attachments', 'messages.creator');

与某些字段的多对多关系“用户”

user
 id
 name
 ...
task
 id
 name
 ...
task_user
 user_id
 task_id
 task_status_id

我的支点模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Relations\Pivot;

class TaskUser extends Pivot
{
    public $incrementing = true;

    public function status()
    {
        return $this->hasOne(TaskStatus::class);
    }
}

如何正确加载“状态”关系?

【问题讨论】:

    标签: php eloquent relationship


    【解决方案1】:

    如果 Laravel 提供了一种在枢轴中传递闭包的方法,那一点也不难,但是目前有两种解决方案来加载枢轴关系

    1。懒惰急切地加载所有内容。

    # App\Task.php
    
    public function users()
    {
        return $this->belongsToMany(App\User::class)->using(App\TaskUser::class)->withPivot('task_status_id');
    }
    
    $task->load('users', ...);
    $task->users->each(function ($user) {
        $user->pivot->load('status');
    });
    

    问题:这会查询与任务相关的每个用户。除非您对结果进行分页,否则这是经典的 N+1 问题。

    2。请改用 hasMany 和 belongsTo。

    • 定义 $user->tasks_user 关系(User hasMany TaskUser)
    • 定义 $task->tasks_user 关系(Task hasMany TaskUser)
    • 定义逆(TaskUser belongsTo User, TaskUser belongsTo Task)
    • 定义最后一个 task_user 关系(TaskUser hasOne TaskStatus)(不过对我来说似乎是一个 belongsTo)
    • 加载关系$task-&gt;load('task_user.user', 'task_user.status')

    除了不使用belongsToMany之外,这个实现并没有真正的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 2018-11-22
      • 2014-08-17
      • 1970-01-01
      • 2021-01-07
      • 2019-07-05
      相关资源
      最近更新 更多