Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL/Elount通过左连接强制id,即使为null_Php_Mysql_Sql_Laravel_Eloquent - Fatal编程技术网

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。重新命名后,现在就可以了。