【问题标题】:Laravel 4 - SQL query to Laravel Eloquent queryLaravel 4 - Laravel Eloquent 查询的 SQL 查询
【发布时间】:2015-02-13 11:46:03
【问题描述】:

我正在处理一个学校项目,并且正在尝试使查询正常工作。

SELECT *
FROM `ziekmeldingen` AS a
WHERE NOT EXISTS
    (SELECT *
     FROM `ziekmeldingen` AS b
     WHERE `ziek` = 1
       AND a.personell_id = b.personell_id)

模型名称:ZiekmeldingenModel

我尝试了 2 件事,都不起作用 ->

$medewerkers = ZiekmeldingenModel::whereNotExists(function($query)
        {
            $query->select()->from('ziekmeldingen AS b')->where('ziek', '=', '1')->where('ziekmeldingen.personell_id', '=', 'b.personell_id');
        })->get();
    return $medewerkers;

$medewerkers = ZiekmeldingenModel::raw('SELECT * FROM `ziekmeldingen` as a WHERE NOT EXISTS ( SELECT * FROM `ziekmeldingen` as b WHERE `ziek` = 1 AND a.personell_id = b.personell_id)')->get();

它们都返回表中的所有结果,而它应该只返回 1 个结果(我已经测试了原始查询,它有效)。

编辑:忘了提到我在模型中使用关系。所以原始解决方案可能无论如何都行不通

【问题讨论】:

    标签: mysql laravel laravel-4


    【解决方案1】:

    找到了答案。不得不使用我尝试过的两种方法的组合。

    $medewerkers = ZiekmeldingenModel::select()
                        ->from(DB::raw('`ziekmeldingen` AS a'))
                        ->whereNotExists(function($query){
                              $query->select()
                              ->from(DB::raw('`ziekmeldingen` AS b'))
                              ->whereRaw('`ziek` = 1 AND a.personell_id = b.personell_id');
                        })->get();
    
    return $medewerkers;
    

    感谢您的帮助和努力。

    【讨论】:

      【解决方案2】:

      绝对不需要select()。也不需要 fromwhereRaw 中的 raw。

      这里唯一不寻常的是 where 中的原始片段,因为您不希望 table.field 被绑定并视为字符串。此外,您可以在整个子句中使用whereRaw,以防您的表为前缀,否则您最终会得到DB_PREFIX_a.personell_id 之类的东西,这显然是错误的。

      这就是你的做法:

      $medewerkers = ZiekmeldingenModel::from('ziekmeldingen AS a')
        ->whereNotExists(function ($q) {
           $q->from('ziekmeldingen AS b')
             ->where('ziek', 1)
             ->where('a.personell_id', DB::raw('b.personell_id'))
             // or:
             // ->whereRaw('a.personell_id = b.personell_id');
        })->get();
      

      【讨论】:

        【解决方案3】:

        使用 take() 方法,但如果您没有对结果进行排序,则返回的记录可能是任何结果。

        $medewerkers = ZiekmeldingenModel::raw('SELECT * FROM `ziekmeldingen` as a WHERE NOT EXISTS ( SELECT * FROM `ziekmeldingen` as b WHERE `ziek` = 1 AND a.personell_id = b.personell_id)')->take(1)->get();
        

        【讨论】:

          猜你喜欢
          • 2017-01-14
          • 2015-02-24
          • 1970-01-01
          • 2017-10-22
          • 2021-11-16
          • 1970-01-01
          • 2013-12-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多