【问题标题】:Laravel multiple conditions outer left join with external variablesLaravel 多条件外左连接与外部变量
【发布时间】:2020-04-17 08:49:13
【问题描述】:

早上好,我有以下多重连接。我想要它作为左外。它对我不起作用...因为它正在将外部联接更改为内部联接。

$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);

这是我使用 ToSql() 方法得到的结果:

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')

我已经尝试使用leftjoin,它将内连接替换为左连接,但是将参数传递给外连接再次无用......因为外连接没有出现在查询中。

我的问题是为什么它忽略了传递的“外部连接”参数?当第二个连接参数是一个函数时,我会错过另一个参数吗?

【问题讨论】:

  • 改用leftjoin()
  • 用过,但我问的是外部...并问为什么它忽略了参数
  • 因为LEFT OUTER JOINLEFT JOIN是一样的。
  • 我已经在使用leftjoin了,我只是想知道原因,现在已经回答了。谢谢。

标签: mysql laravel left-join outer-join


【解决方案1】:

查看join-function-source-code

join(string $table, string $first, string|null $operator = null, string|null $second = null, string $type = 'inner', bool $where = false)

$first 可以是闭包的实例,所以当你使用闭包作为第二个参数时,"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 而不是join

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

【讨论】:

    猜你喜欢
    • 2010-11-11
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    相关资源
    最近更新 更多