【问题标题】:Convert SQL to Laravel将 SQL 转换为 Laravel
【发布时间】:2019-11-11 10:04:05
【问题描述】:

假设我有这个:

SELECT * FROM drivers where driver_number NOT IN (SELECT driver_number FROM buses) AND station_id = 2 OR driver_number = 'Dr_02'

它会显示这些数据

然后我想将此数据作为 laravel 查询获取,这就是我所做的:

$drivers = Driver::whereRaw('driver_number not in (select driver_number from buses) AND station_id = ? ', [$station_id].' OR id = ?', [$bus->Driver_id])
                    ->get();

但我收到此错误:

SQLSTATE[42000]:语法错误或访问冲突:1064 你有一个 SQL 语法错误;检查与您对应的手册 MariaDB 服务器版本,用于在 'driver_number 附近使用正确的语法 不在(从公共汽车中选择 driver_number)和 station_id = ?'在第 1 行 (SQL: select * from drivers where id = 2 driver_number 不在 (从公共汽车中选择 driver_number)AND station_id = ?)

我认为这样说有错误,那就是它得到了类型系统错误。因此,如果有人知道更好的方法,您可以提供帮助。

【问题讨论】:

  • 请在您的WHERE 子句中添加括号以使其明确。
  • 你可以试试 $task_without_due_date = \DB::select(\DB::raw("your query)); 这个也可以

标签: php mysql laravel eloquent laravel-query-builder


【解决方案1】:

你可以试试

$task_without_due_date = \DB::select(\DB::raw("SELECT * FROM drivers where driver_number NOT IN (SELECT driver_number FROM buses) AND station_id = '.$station_id.' OR driver_number = '.$bus->Driver_id.'"));

【讨论】:

  • 当我这样运行它时,除了[ ],它不会重新运行任何东西。但是当我删除 AND station_id = '.$station_id.' 时它会起作用,但它会返回我不想要的数据。
  • 添加 OR 并检查 bcoz 我没有确切的代码,所以我怎么能弄清楚
  • 你可以调试你的查询 DB::enableQueryLog(); // 启用查询日志 // 你的 Eloquent 查询 dd(DB::getQueryLog()); // 显示日志结果
【解决方案2】:

这在 Laravel 中很难处理。 WHERE 子句中的逻辑基本上是(A and B) or C,其中条件A 可以用MySQL 中的NOT EXISTS 子查询来表示。

$drivers = DB::table('Driver d')
    ->where(function($query1) {
        return $query1
            ->whereNotExists(function ($query2) {
                $query2->select(DB::raw(1))
                    ->from('buses b')
                    ->whereRaw('d.driver_number = b.driver_number');
              })
            ->where('station_id', '=', '2');
    })
    ->orWhere('driver_number', '=', 'Dr_02');
->get();

【讨论】:

  • 感谢您的重播,但您的回答显示此compact(): Undefined variable: operator
  • @Lafoune 你用的是什么版本的 Laravel?
  • laravel 5.5,是我用的版本有问题吗?
  • 我目前无法测试我的代码。我的回答和将整个查询作为原始查询运行是我能看到的仅有的两种可能性。
【解决方案3】:

试试看,

$result = DB::table('drivers')
->whereNotIn('driver_number', function($q){
    $q->select('driver_number')->from('buses');
})
->where('station_id', '=', 2)
->where('driver_number', '=', 'Dr_02')
->get();

【讨论】:

    猜你喜欢
    • 2016-08-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 2021-09-13
    • 2020-10-03
    • 1970-01-01
    相关资源
    最近更新 更多