Laravel 查询构建器与 where 左外连接

Posted

技术标签:

【中文标题】Laravel 查询构建器与 where 左外连接【英文标题】:Laravel query builder left outer join with where 【发布时间】:2017-03-09 09:32:55 【问题描述】:

我想使用带有 where 条件的 laravel 查询构建器进行左外连接。 我有 3 张桌子:

用户(ID、姓名、..) 路线(ID、姓名、..) user_route (id, user_id, route_id)

我只想为特定用户选择 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 的数据库插件的名称)的情况下进行此类查询?

【问题讨论】:

看laravel.com/docs/5.3/eloquent-relationships 【参考方案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();

只需确保您在 Route 模型中定义了 users 关系。

【讨论】:

感谢您的回答,但是我有连接表 user_route。我在哪里将这 3 个表连接在一起? 你没有。 Eloquent 将在内部使用这个中间表进行连接。【参考方案2】:

看起来您从未真正调用过“get”方法。试试这个:

<?php

$userid = 10;
$result = DB::table('route')
->join('user_route', 'route.id', '=', 'user_route.route_id')
->select('*')
->where('user_route.user_id', '=', $userid)
->get();

?>

请注意,您需要根据您的表格添加正确的键。如果我们能看到您的数据结构,这会更容易。

【讨论】:

以上是关于Laravel 查询构建器与 where 左外连接的主要内容,如果未能解决你的问题,请参考以下文章

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

具有许多表、左外连接和 where 子句的 LINQ 查询

使用内连接,左外连接,交叉应用获取语法错误与 Where 子句

左外连接还是 where 语句?

如何使用 linq lambda 扩展方法执行带有 where 子句的左外连接

使用子查询改进 MySql 查询左外连接