我有两个表:users
和students
。这些表按字段连接:
users.id = studetns.user_id
我尝试使用请求获取信息:
$students = User::where(function ($query) use ($request) {
// Filter by name
if (($term = $request->get("name"))) {
$query->where('name', 'like', '%' . $term . '%');
$query->where('secondname', 'like', '%' . $term . '%');
}
})->with("details")->where('type', '2')->orderBy('name', 'desc')->get();
dd($students);
您可以看到with("details")
,必须连接表格。
我的模型User
是:
public function details()
{
return $this->hasOne('App\Student', 'user_id', 'id');
}
当我执行查询时,我收到错误:
select * from `users` where `type` = 2 order by `name` desc)
这意味着没有与第二个表连接,其中有name
个fiels。
答案 0 :(得分:2)
如果name
和secondname
位于students
表中,请尝试以下操作:
$students = User::where('type', '2')
->with(['details' => function ($query) use ($request) {
if (!empty($request->name)) {
$query->where('name', 'like', '%'.$request->name.'%');
$query->orWhere('secondname', 'like', '%'.$request->name.'%');
}
$query->orderBy('name', 'desc');
}])->get();
这将加载并订购所有students
(或者,如果$request->name
变量存在,则所有students
都按其值进行过滤。)
PS:正如@ jedrzej.kurylo所说,如果你想在orWhere
栏中找到name
列或,secondname
}使用SELECT (@a:=@a+1 ) AS sl, student_id, student_name, schl_id, class_id FROM (SELECT @a:=0) as BSS, trans_student AS TS WHERE TS.status= 1 AND academic_year = '2016-2017' ORDER BY sl ASC LIMIT 0,15
运算符是有道理的
答案 1 :(得分:1)
通过在传递给 where()的回调中按名称过滤来加载用户模型的方式会导致错误,因为没有名称< 用户表中的/ strong>列,因此根本无法正常工作。
如果您要加载在相关学生表中提供姓名的用户,则需要使用 whereHas():
$students = User::whereHas('details', function ($query) use ($request) { // Filter by name
if (($term = $request->get("name"))) {
$query->where('name', 'like', '%' . $term . '%');
$query->where('secondname', 'like', '%' . $term . '%');
}
})
->join('details', 'details.user_id', '=', 'users.id')
->with("details")
->where('type', '2')
->orderBy('name', 'desc')
->get();
我还认为您可能希望名称或第二名与 $ term 匹配的用户,因此我建议您替换:
$query->where('name', 'like', '%' . $term . '%');
$query->where('secondname', 'like', '%' . $term . '%');
与
$query->where('name', 'like', '%' . $term . '%');
$query->orWhere('secondname', 'like', '%' . $term . '%');