Laravel 4:将 where 子句添加到连接条件

Posted

技术标签:

【中文标题】Laravel 4:将 where 子句添加到连接条件【英文标题】:Laravel 4: Adding where clause to a join condition 【发布时间】:2014-01-19 17:39:38 【问题描述】:

它在laravel docs 中说可以在连接上添加 where 子句,但是每当我尝试使用 where 子句在我的代码中,我得到错误:Call to undefined method Illuminate\Database\Query\JoinClause::where()。有人知道如何在join子句中添加where子句吗?

Laravel 网站示例:

DB::table('users')
->join('contacts', function($join)

  $join->on('users.id', '=', 'contacts.user_id')
  ->where('contacts.user_id', '>', 5);
)
->get();

我正在尝试实现的代码:

DB::table('users')
->join('contacts', function($join)

  $current_date = date('Y-m-d');
  $join->on('users.id', '=', 'contacts.user_id')
  ->where('contacts.effective_date', '>=', $current_date);
)
->get();

【问题讨论】:

您将错误的变量传递给 where 子句尝试更正。 好的,更新了变量名,但问题依旧。 尝试在 where 子句中只使用 > ...... 【参考方案1】:

如果您想在 join 上添加更多条件,请添加更多 $join->on$join->orOn

如果您想为您的第一个选择添加条件,请将其添加到连接函数之外。

DB::table('users')
->join('contacts', function($join)

    $date = date('Y-m-d');
    $join->on('users.id', '=', 'contacts.user_id');
)
->where('contacts.effective_date', '>=', $date);
->get();

更新 在我认为您使用的 Laravel 4.0 中,您不能在连接闭包中使用 where,但由于 Laravel 4.1 及更高版本,您可以在连接条件之后使用 where 条件。我找不到 Laravel 4.1 的文档,但 this is the #join documentation for L4.2 and above

【讨论】:

我不能使用'on',因为它不能使用静态日期加入。我想做的是在将结果加入其他表之前对其进行过滤,这实际上会缩短执行时间。 还要注意这个:github.com/laravel/framework/issues/3681 这样做时绑定搞砸了。【参考方案2】:

请查看下面的答案

DB::table('users')
        ->join('contacts', function($join)
        
            $join->on('users.id', '=', 'contacts.user_id')
                 ->where('contacts.user_id', '>', 5);
        )
        ->get();

【讨论】:

【参考方案3】:

试试这个解决方案

 DB::table('users')
            ->join('contacts', function($join)
            
                $current_date = date('Y-m-d');
                $join->on('users.id', '=', 'contacts.user_id')
                     ->where('contacts.effective_date', '>', $current_date)
             ->where('contacts.effective_date', '=', $current_date);

            )
            ->get();

【讨论】:

这就是问题所在。当我添加上面问题中所述的 where 子句时出现错误。【参考方案4】:
$current_date = date('Y-m-d');
DB::table('users')
->join('contacts', function($join) use ($current_date)

  $join->on('users.id', '=', 'contacts.user_id')
      ->where('contacts.effective_date', '>=', $current_date);
)
->get();

【讨论】:

【参考方案5】:

您正在调用 $current_date 但您取消了 $date

DB::table('users')
->join('contacts', function($join)

  $date = date('Y-m-d');
  $join->on('users.id', '=', 'contacts.user_id')
  ->where('contacts.effective_date', '>=', $date);
)
->get();

不知道这样能不能解决问题,试试看;)

【讨论】:

【参考方案6】:

您确定您使用的是 laravel 4.1?我认为您使用的是 laravel 4.0 而不是 4.1。查看您的 composer.json 文件。

【讨论】:

这更多的是评论而不是问题的答案【参考方案7】:

get() 函数调用之前添加它

->where('contacts.effective_date', '=', $current_date);

【讨论】:

【参考方案8】:
$users = DB::table('users')
    ->join('contacts', 'users.id', '=','contacts.user_id')
    ->join('orders', 'users.id', '=', 'orders.user_id')
    ->select('users.*', 'contacts.phone', 'orders.price')->get();

https://laravel.com/docs/5.6/queries请查看此链接

【讨论】:

以上是关于Laravel 4:将 where 子句添加到连接条件的主要内容,如果未能解决你的问题,请参考以下文章

4 个连接 + 3 个 where 子句的查询构建器正确语法(Laravel 5.7)

Laravel 在联合结果中添加 where 子句

如何在 switch 语句中使用 laravel 模型运行多个 Where 子句

在laravel中雄辩的where子句中连接两列

Laravel 4 Eloquent 动态 Where 子句

Laravel 4:可选 where 子句