Laravel несколько условий внешнего левого соединения с внешними переменными - PullRequest
0 голосов
/ 17 апреля 2020

Доброе утро, у меня есть следующие несколько соединений. Я хочу, чтобы это оставалось внешним. Это не работает для меня ... потому что это меняет внешнее соединение на внутреннее.

$query=DB::Table("Users")->select("Users.*","Strings.Text as Title","Strings2.Text as Name" ,"Strings3.Text as Description", "Strings4.Text as Summary")
    ->join("Strings",function($join) use($bbddlang)
        {
            $join->on("Users.HeroTitle","Strings.StringID");
            $join->where("Strings.Lang",$bbddlang);
        }, "left outer")
    ->join("Strings as Strings2",function($join) use($bbddlang)
        {
            $join->on("Users.HeroName","Strings2.StringID");
            $join->where("Strings2.Lang",$bbddlang);
        }, "left outer")
    ->join("Strings as Strings3",function($join) use($bbddlang)
        {
            $join->on("Users.Description","Strings3.StringID");
            $join->where("Strings3.Lang",$bbddlang);
        }, "left outer")
    ->join("Strings as Strings4",function($join) use($bbddlang)
        {
            $join->on("Users.Summary","Strings4.StringID");
            $join->where("Strings4.Lang",$bbddlang);
        }, "left outer")
    ->where("Strings.Text",$hero);

Вот что я получаю, используя метод To Sql ():

select `Users`.*, `Strings`.`Text` as `Title`, `Strings2`.`Text` as `Name`, `Strings3`.`Text` as `Description`, `Strings4`.`Text` as `Summary` 
from `Users` 
inner join `Strings` 
    on `Users`.`HeroTitle` = `Strings`.`StringID` 
    and `Strings`.`Lang` = ? 
inner join `Strings` as `Strings2` 
    on `Users`.`HeroName` = `Strings2`.`StringID` 
    and `Strings2`.`Lang` = ? 
inner join `Strings` as `Strings3` 
  on `Users`.`Description` = `Strings3`.`StringID` 
      and `Strings3`.`Lang` = ? 
inner join `Strings` as `Strings4` 
  on `Users`.`Summary` = `Strings4`.`StringID` 
      and `Strings4`.`Lang` = ? 
where `Strings`.`Text` = ?

(? Являются внешними переменными для запроса, это не проблема).

Когда это одиночное условие, оно выглядит так:

->join('answers as answers', 'responses.answer_id', '=', 'answers.id', 'left outer')

Я пробовал с левым соединением, и оно заменяет внутреннее соединение левым соединением, но передача параметра внешнему снова бесполезно ... так как external не появляется в запросе.

Мой вопрос: почему он игнорирует переданный параметр "external join"? Я пропускаю другой параметр, когда второй параметр соединения является функцией?

1 Ответ

0 голосов
/ 17 апреля 2020

Проверка join-function-source-code

join (строка $ table, строка $ first, строка | null $ operator = null, строка | null $ second = null, строка $ type = 'inner', bool $ where = false)

$first может быть экземпляром Closure, поэтому, когда вы используете closure в качестве второго параметра, "left join" в качестве третьего параметра $operator, $type имеет значение по умолчанию "inner". Вот почему необработанные sql всегда возвращаются inner join ....

Вам нужно поставить LEFT OUTER в 5-е положение:

->join("Strings", function($join) use($bbddlang)
        {
            $join->on("Users.HeroTitle","Strings.StringID");
            $join->where("Strings.Lang",$bbddlang);
        },  null, null, "left outer")

Поэтому рекомендуем использовать leftjoin с Closure вместо join

->leftjoin("Strings", function($join) use($bbddlang)
        {
            $join->on("Users.HeroTitle","Strings.StringID");
            $join->where("Strings.Lang",$bbddlang);
        })
...