提问者:小点点

Laravel有一个通过关系


我在Laravel应用程序中设置了以下数据库模式。为了简单起见,我只提到重要的专栏。

任务

  • job_id

工作啊

  • client_id

使用者

  • 身份证

在任务模型中,我希望有一个与用户表的关系方法,在本例中,它被称为中间作业表上的客户机(Client\u id)。

在我的代码中,我希望能够引用$task-

我查阅了这些文件,发现:

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

返回:

"SQLSTATE[42S22]:找不到列: 1054字段列表中的未知列'jobs.user_id'(SQL:选择用户.*,作业.client_idaspivot_client_iduser_id作为pivot_user_id用户内连接作业用户id=作业user_id其中作业client_id=112和用户deleted_at为空)"

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

返回:

"SQLSTATE[42S22]:找不到列:1054未知列'users.user_id'in'on子句'(SQL:选择用户.*,作业.client_idaslaravel_through_keyfrom>用户内连接作业。id=用户user_id其中作业deleted_at为空,作业client_idcode>=111和用户deleted_at为空限制1)"

如何从任务模型中检索用户模型?


共2个答案

匿名用户

你能试一下吗

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

匿名用户

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

在你的任务模型类中:

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...           ---'
    );
}

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

正确的引用总是让我感到困惑,所以希望这能有所帮助。:)

有关参考信息,请参见具有一到键约定

实际上:

当您运行任务::(['客户端'])-

select * from `tasks`

它从这些结果行中提取所有唯一的作业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)

使用Laravel 8.47进行测试。0使用MySQL。