【发布时间】:2019-05-08 05:05:28
【问题描述】:
我有一对一的关系。我的jobs 表已连接到user_jobs 表。
我已加入该关系以获取与作业相关的用户数据。
这是我在 Job 模型中的关系:
public function client(){
return $this->hasOne('App\ClientJob')->leftJoin('clients', 'client_jobs.client_id', 'clients.id')
->select('clients.id', 'client_id', 'job_id', 'name');
}
这部分代码有效,我得到了客户数据。
但是我无法在该关系上添加 where 子句(特别是获取的名称列)。
这是我的代码中尝试search users by their name 列的部分:
$jobs = Job::
when($request->input('keywords'), function($query) use ($request) {
return $query->where(function ($query) use ($request) {
$keywords = $request->input('keywords');
$query->where('title', 'like', '%'.$keywords.'%');
$query->orWhereHas('client', function ($query) use ($keywords){
$query->where('name', 'like', '%'.$keywords.'%');
});
$query->orWhereHas('category', function ($query) use ($keywords){
$query->where('name', 'like', '%'.$keywords.'%');
});
$query->orWhereHas('status', function ($query) use ($keywords){
$query->where('name', 'like', '%'.$keywords.'%');
});
});
})
这部分出现“找不到列”错误。
$query->orWhereHas('client', function ($query) use ($keywords){
$query->where('name', 'like', '%'.$keywords.'%');
});
除了删除模型内部的连接并将其移动到 where 子句上方的查询中之外,任何人都知道如何启动和运行此查询?
编辑
这是我的全部查询:
$jobs = Job::
when($request->input('keywords'), function($query) use ($request) {
return $query->where(function ($query) use ($request) {
$keywords = $request->input('keywords');
$query->where('title', 'like', '%'.$keywords.'%');
$query->orWhereHas('client', function ($query) use ($keywords){
$query->where('name', 'like', '%'.$keywords.'%');
});
$query->orWhereHas('category', function ($query) use ($keywords){
$query->where('name', 'like', '%'.$keywords.'%');
});
$query->orWhereHas('status', function ($query) use ($keywords){
$query->where('name', 'like', '%'.$keywords.'%');
});
});
})
->with(['client','category' => function($query){
$query->select('id', 'name');
},'status' => function($query){
$query->select('id', 'name', 'color');
}])
->when($request->input('sort_by'), function($query) use ($request) {
if($request->sort_by == 'desc'){
$query->orderBy('created_at', 'desc');
}else{
$query->orderBy('created_at', 'asc');
}
})
->paginate(15);
【问题讨论】:
-
试试client.name
-
不幸的是,client.name 或 clients.name 都不起作用。
-
试试 Job::with('client')
-
去掉
paginate()方法,这样你就得到了一个未执行的Query对象。然后在上面做一个->toSql()和一个->getBindings()。这将向您展示 SQL QueryBuilder 将尝试执行的内容。如果问题的根源不明显,请发布结果,以便我们进一步剖析。 -
您确定他们未找到的列来自客户关系吗?
标签: php laravel laravel-5 relationship one-to-one