Laravel HasOneThrough关系

时间:2020-07-03 10:33:29

标签: php sql database laravel eloquent

我在Laravel应用中设置了以下数据库架构。为了简化起见,我仅提及重要的列。

任务

  • job_id

工作

  • client_id

用户

  • id

在“任务”模型中,我希望有一个与users表的关系方法,在这种情况下,该表称为中间client_id表上的Client(jobs)。

在我的代码中,我希望能够引用$task->client();

我浏览了文档,发现其中之一:

public function client()
{
    return $this->belongsToMany('App\User', 'users', 'client_id');
}

返回:

“ SQLSTATE [42S22]:找不到列:1054未知列'jobs.user_id' 在“字段列表”中(SQL:选择users。*,jobsclient_id作为 pivot_client_id中的jobsuser_idpivot_user_id来自users jobs上的内部联接usersid = jobsuser_id其中 jobsclient_id = 112和usersdeleted_at为空)”

public function client()
{
    return $this->hasOneThrough('App\User', 'App\Job', 'client_id', 'user_id');
}

返回:

“ SQLSTATE [42S22]:找不到列:1054未知列 “ on子句”中的“ users.user_id”(SQL:选择users。*, jobsclient_id作为laravel_through_key的内部联接中的users jobs上的jobsid = usersuser_id,其中jobsdeleted_at是 null和jobsclient_id = 111和usersdeleted_at为null 限制1)“

如何从User模型中检索Task模型?

2 个答案:

答案 0 :(得分:0)

您可以尝试以下方法吗?

public function client()
{
    return $this->hasOneThrough('App\User', 'App\Job', 'id', 'id', 'id', 'client_id');
}

答案 1 :(得分:0)

对于仍在寻找有效答案的任何人:

在您的 Task 模型类中:

public function client()
{
    return $this->hasOneThrough(
        User::class, // 'App\User' or 'App\Models\User' in Laravel 8
        Job::class, // 'App\Job' or 'App\Models\Job' in Laravel 8
        'id', // Foreign key on the jobs table...       <--,
        'id', // Foreign key on the users table...         |    <--,
        'job_id', // Local key on the tasks table...    ---'       |
        'client_id' // Local key on the jobs table...           ---'
    );
}

箭头显示哪一列用于链接到另一列。

正确的引用总是让我困惑一分钟,所以希望这会有所帮助。 :)

参考Has One Through - Key conventions

实践中:

当您运行 Task::with(['client'])->first() 时,框架会运行 2 个 SQL 查询:

select * from `tasks`

从这些结果行中提取所有唯一的 job_id 以用于第二个 SQL 的绑定 (?):

select
    `users`.*,
    `jobs`.`id` as `laravel_through_key`
from `users`
inner join `jobs`
    on `jobs`.`client_id` = `users`.`id`
where `jobs`.`id` in (?, ? ...etc)

使用 MySQL 在 Laravel 8.47.0 上测试。