【发布时间】:2019-02-13 22:39:48
【问题描述】:
我用 Eloquent 写了这个查询:
return TypeModel::with(['apt' => function($q) use ($id){
$q->leftJoin('build_apt', function($join) use($id){
$join->on('build_apt.id_apt', '=', 'apt.id_apt');
$join->on('build_apt.id_build', '=', DB::raw($id->id_build));
})
}])
->get()
->toJson();
等效 SQL:
SELECT *
FROM `apt`
LEFT JOIN `build_apt`
ON `build_apt`.`id_apt` = `apt`.`id_apt`
AND `build_apt`.`id_build` = 1
WHERE `apt`.`id_typeapt` in (1, 2, 3, 4, 5)
我有我需要的结果,除了一件事,给定的 id 是 null :
[
{"id_typeapt":1,"apt":[
{"id_apt":null,"image_apt":"apt_1.png"},
{"id_aptitude":null,"image_apt":"apt_2.png"}
]
]
如何强制它从“apt”表中查找 id 而结果不给我“null”?
谢谢!
编辑:Where 子句来自 with
public function apt(){
return $this->hasMany(AptModel::class, 'id_typeapt', 'id_typeapt');
}
EDIT2:
id_apt 被另一个id_apt 粉碎了,只需简单的重命名我就可以检索到 id:
return TypeModel::with(['apt' => function($q) use ($id){
$q->leftJoin('build_apt', function($join) use($id){
$join->on('build_apt.id_apt', '=', 'apt.id_apt');
$join->on('build_apt.id_build', '=', DB::raw($id->id_build));
})
}])->select(DB::raw("*, apt.id_apt as id_apt);
}])
【问题讨论】:
-
WHERE子句从何而来?请展示你所有的 Eloquent 代码。 -
来自
with。我更新了帖子 -
从 SQL 的角度来看,您需要将
WHERE子句移动到LEFT JOIN上的ON条件build_apt。 -
select * from
aptleft joinbuild_aptonbuild_apt.id_apt=apt.id_aptandbuild_apt.id_build= 1 and @987654id_typeaptin (1, 2, 3, 4, 5)
标签: php mysql sql laravel eloquent