简体   繁体   English

Laravel 4-Laravel口才查询的SQL查询

[英]Laravel 4 - SQL query to Laravel Eloquent query

I'm working on a school project and I'm trying to get a query working. 我正在做一个学校项目,正在尝试使查询工作。

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

Name of the model: ZiekmeldingenModel 型号名称:ZiekmeldingenModel

I tried 2 things, both dont work -> 我尝试了两件事,都没有用->

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

And

$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();

Both of them give back all the results from the table while it should only give back 1 result (I've tested the original query, it works). 他们两个都返回表中的所有结果,而它只应返回1个结果(我已经测试了原始查询,它可以工作)。

EDIT: Forgot to mention I'm using relationships in the model. 编辑:忘了提及我在模型中使用关系。 So the raw solution probably won't work anyway 因此原始解决方案可能仍然无法正常工作

Found the answer. 找到了答案。 Had to use a combo of both the things I tried. 必须同时使用我尝试过的两种方法。

$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;

Thanks for any help and effort. 感谢您的帮助和努力。

Definitely no need for select() . 绝对不需要select() Also no raw in from or whereRaw needed. 也没有生在fromwhereRaw需要。

The only unusual thing here is raw piece in the where, since you don't want table.field to be bound and treated as string. 唯一不寻常的事情是原始位置,因为您不想将table.field绑定并视为字符串。 Also, you can use whereRaw for the whole clause in case you have your tables prefixed, otherwise you would end up with something like DB_PREFIX_a.personell_id , so obviously wrong. 另外,如果为表加上前缀,则可以对整个子句使用whereRaw ,否则最终将得到DB_PREFIX_a.personell_id类的DB_PREFIX_a.personell_id ,因此显然是错误的。

This is how you do it: 这是您的操作方式:

$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();

使用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();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM