MySQL / Eloquent принудительный идентификатор левого соединения, даже если ноль - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть этот запрос, написанный на 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_typeapt":1,"apt":[
        {"id_apt":null,"image_apt":"apt_1.png"}, 
        {"id_aptitude":null,"image_apt":"apt_2.png"}
    ]
]

Как я могу заставить его искать идентификатор из таблицы «apt» и не давать мне «null» в результате?

Спасибо вам!

РЕДАКТИРОВАТЬ: Откуда берется предложение с

public function apt(){
    return $this->hasMany(AptModel::class, 'id_typeapt', 'id_typeapt');
}

EDIT2:

id_apt было уничтожено другим id_apt с простым переименованием, я мог получить идентификатор:

    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);
  }])

1 Ответ

0 голосов
/ 14 февраля 2019

Вы используете LEFT JOIN, что вам нужно, однако у вас есть условия для объединенной таблицы в предложении WHERE.Это на самом деле превращает ваш LEFT JOIN в INNER JOIN, так как несоответствующие записи будут отфильтрованы предложением WHERE.

Вам нужно настроить свой код Eloquent для генерации следующего запроса 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...