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)
如何在 switch 语句中使用 laravel 模型运行多个 Where 子句