下面这两个例子是自己亲自做的 有大用 红色部分就是不同的地方
$activitys = User::join('activity_log','users.id','=','activity_log.user_id')->orderby('activity_log.id','desc')
->where(function($query) use ($own){
$query->whereExists(function($query1) use ($own){
$query1->select('user_relation_level.user_id')
->from('user_relation_level')
->whereRaw('user_relation_level.parent_user_id='.$own->id .'
and users.id=user_relation_level.user_id');//左边是查看自己 儿子们的日志
})->orWhere('users.id','=',$own->id);//左边是查看自己 的日志
})->where('activity_log.is_finance','=','1')
->orderby('activity_log.id','desc')->paginate(20);
$activitys = User::join('activity_log','users.id','=','activity_log.user_id')->orderby('activity_log.id','desc')
->where(function($query) use ($own){
$query->whereExists(function($query1) use ($own){
$query1->select('user_relation_level.user_id')
->from('user_relation_level')
->whereRaw('user_relation_level.parent_user_id='.$own->id .'
and users.id=user_relation_level.user_id');//左边是查看自己 儿子们的日志
})->orWhere('users.id','=',$own->id);//左边是查看自己 的日志
})->orderby('activity_log.id','desc')->paginate(20);
下面这个例子 也是使用 WhereRaw的例子 其实 WhereRaw($sql语名) 可以用 where(DB::raw($sql语名) DB::raw 来代替
(好像不能代替,至少代替后代码应该作相应的改动,见下面的说法)
public function scopeWhereGroupByUsesIdOrderById($query){
$query->whereRaw("activity_log.id in
(select SUBSTRING_INDEX(group_concat(id order by id desc),',',1)
from activity_log group by user_id) ");
}
$kehus = Kehu::join('operations','kehus.kehu_id','=','operations.kehu_id')->whereRaw("operations.operation_id in
(select SUBSTRING_INDEX(group_concat(op_inner.operation_id order by op_inner.operation_id desc),',',1) from
operations as op_inner group by op_inner.kehu_id)")->where('operations.operation_next_operate_time','<=',Carbon::now()->addDays(15))->paginate(20);
you use sql where exists clause in laravel. whereExists through you can use sql where exists clause in your laravel project. It is very easy to use and you can easily undestand. You can give SELECT statment in where condition. you can see bellow example and you can learn how to use whereExists in your app.
SQL Query
SELECT *
FROM `items`
WHERE EXISTS
(SELECT `items_city`.`id`
FROM `items_city`
WHERE items_city.item_id = items.id)
Using Laravel Query Builder
DB::table('items')
->whereExists(function ($query) {
$query->select("items_city.id")
->from('items_city')
->whereRaw('items_city.item_id = items.id');
})
->get();
来自 http://itsolutionstuff.com/post/laravel-5-query-builder-where-exists-exampleexample.html
| 这是我雄辩的查询: $table = DB::table('invites') ->leftjoin('connections', 'connections.user_id', '=', 'invites.user_id') ->where(DB::raw('connections.firm_id = invites.firm_id')) ->get(); 它应该返回一个连接到已经邀请他们的公司的用户的表。 查询日志显示执行以下查询: 'query' => 'select * from `invites` left join `connections` on `connections`.`user_id` = `invites`.`user_id` where connections.firm_id = invites.firm_id is null' 将is null 在年底被搞乱一切。我认为这是与列名称相同的事实,或者我是否缺少DB :: raw的东西? |
| |
| where()方法将列名称作为第一个参数,如果下一个参数丢失,则将其视为列为空的约束,这就是为什么您得到这样一个奇怪的查询。使用whereRaw()代替: ->whereRaw('connections.firm_id = invites.firm_id') 来自 https://stackoverflow.com/questions/34743325/eloquent-adds-is-null-to-where-query-after-a-left-join
Laravel雄辩地向DB查询添加IS NULL
嗨,大家好! 我遇到了一个问题。由于Laravel正在添加的一些奇怪的原因是null。我有以下代码: Timer :: where('user_id',Auth :: id()) - >其中(DB :: raw(“DATE(started_at)= DATE(NOW())”) - > whereNotNull('ends_at') - >得到(); 这导致:select * from time where user_id =?和DATE(started_at)= DATE(NOW())为空,ended_at 不为空 我不明白的是,在DATE(NOW())之后,它在哪里是空的?我错过了什么吗? 欧文 哪里需要两个参数,你只有一个。使用whereRaw代替。 Thx,从来没有,这将是问题。所以一个var在 - >其中result为null。 该where() 方法以形式使用where($column, $operator, $value) ,例如where('reputation', '>', 10) 。如果您使用的是equals运算符,则可以提供两个参数,例如where('user_id', 4) 。 查看API的方法:https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Query/Builder.php#L384,如果您只提供列,则运算符和值默认为空值。在方法中进一步下调,检查值是否为空,并将查询转换为适当的“is null”条件(因为使用“field = null”将不起作用),因此与您的行为似乎一致正在看。 因此,如上所述,whereRaw() 您需要使用特定于您正在使用的DBMS的原始数据,而不是抽象的查询构建器。
来自 https://laravel.io/forum/09-13-2014-laravel-eloquent-adding-is-null-to-db-query?page=1 注释 |
nikoskip 评论 on 10 Jun 2013