我在Laravel应用中设置了以下数据库架构。为了简化起见,我仅提及重要的列。
任务
工作
用户
在“任务”模型中,我希望有一个与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
。*,jobs
。client_id
作为pivot_client_id
中的jobs
和user_id
。pivot_user_id
来自users
jobs
上的内部联接users
。id
=jobs
。user_id
其中jobs
。client_id
= 112和users
。deleted_at
为空)”
或
public function client()
{
return $this->hasOneThrough('App\User', 'App\Job', 'client_id', 'user_id');
}
返回:
“ SQLSTATE [42S22]:找不到列:1054未知列 “ on子句”中的“ users.user_id”(SQL:选择
users
。*,jobs
。client_id
作为laravel_through_key
的内部联接中的users
jobs
上的jobs
。id
=users
。user_id
,其中jobs
。deleted_at
是 null和jobs
。client_id
= 111和users
。deleted_at
为null 限制1)“
如何从User
模型中检索Task
模型?
答案 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 上测试。