Php MySQL/Elount通过左连接强制id,即使为null
我用雄辩的语言写下了这个问题:Php MySQL/Elount通过左连接强制id,即使为null,php,mysql,sql,laravel,eloquent,Php,Mysql,Sql,Laravel,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_bui
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为空:
[
{"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');
}
编辑2:
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);
}])
您使用的是LEFT JOIN,这是您想要的,但是WHERE子句中对连接表有条件。这实际上会将左连接变成内部连接,因为不匹配的记录将被WHERE子句过滤掉
您需要调整雄辩的代码,以生成以下SQL查询:
SELECT *
FROM `apt`
LEFT JOIN `build_apt`
ON `build_apt`.`id_apt` = `apt`.`id_apt`
AND `build_apt`.`id_build` = 1
AND `apt`.`id_typeapt` in (1, 2, 3, 4, 5)
Where从句来自哪里?请展示你所有的雄辩代码。它来自于with。我更新了postFrom SQL透视图,您需要将WHERE子句移动到构建时左连接的ON条件中。选择*从1、2、3、4中的apt LEFT JOIN build\u apt ON build\u apt.id\u apt=apt.id\u apt和build\u apt.id\u build=1和apt.id\u typeapt,5在使用此查询的MySQL中,列id_apt保持为空,因为“build_apt”中没有匹配项。另一列正在压碎所需的实际id。重新命名后,现在就可以了。