我想在laravel查询构建器中使用where条件进行左外连接。 我有3张桌子:
我想选择仅针对特定用户的user_route表中未列出的所有路由。
我尝试了什么:
$q = DB::table('route')
->join('user_route', 'route.id', '=', user_route.route_id', 'left outer')
->where('user_route.user_id', '!=', $filter->user);
这将不返回任何行。
$q = DB::table('route')
->leftJoin('user_route', function($join) use ($filter)
{
$join->on('route.id', '=', 'user_route.route_id')
->where('user_route.user_id', '=', DB::raw($filter->user));
});
这将返回所有路由,因为它不是外连接。
也试过这样的事情:
$q = DB::table('route')
->join('user_route', function($join) use ($filter)
{
$join->on('route.id', '=', 'user_route.route_id')
->where('user_route.user_id', '=', DB::raw($filter->user));
}, 'left outer');
或
$q = DB::table('route')
->join('user_route', function($join) use ($filter)
{
$join->on('route.id', '=', 'user_route.route_id', 'left outer')
->where('user_route.user_id', '=', DB::raw($filter->user));
});
他们都没有工作。
我做了一个丑陋的解决方法,我用左连接选择所有路由,在PHP中我删除了user_id不为NULL的路由(例如存在)。
有没有人知道如何在SQL中进行此类查询并将其传递给Eloquent(或者Laravel的DB插件的名称是什么)?
答案 0 :(得分:1)
查看Eloquent的 whereDoesntHave()方法。它允许您过滤掉相关表中没有记录的记录。
在您的情况下,您要执行以下操作:对于给定用户,获取与该用户无关的所有路由。以下代码应该可以解决问题:
// $userId contains the ID of the user for which you want to get the unrelated routes
$routes = Route::whereDoesntHave('users', function($query) use ($userId) {
$query->where('id', '!=', $userId);
})->get();
确保您在路线模型中定义用户关系。
答案 1 :(得分:0)
看起来你实际上从来没有打电话给"得到"方法。试试这个:
<?php
$userid = 10;
$result = DB::table('route')
->join('user_route', 'route.id', '=', 'user_route.route_id')
->select('*')
->where('user_route.user_id', '=', $userid)
->get();
&GT;
请注意,您需要根据表格添加正确的密钥。如果我们能够看到您的数据结构,这将更容易。