php – 如何在Laravel Eloquent中编写MySQL查询代码?
我正在尝试使用半复杂的查询(无论如何,按照我的标准)但我无法想象如何使用查询构建器或使用雄辩的关系来完成它.
我的关系表是:user_id_1 | user_id_2 |状态|对于朋友,action_user_id可以忽略action_user_id,状态= 1.每个关系只有一行,所以如果要选择属于用户17的所有关系,则需要同时检查user_id_1和user_id_2,因为id可能是在任一栏中.我从这里跟踪数据库结构:http://www.codedodle.com/2015/03/social-network-friends-relationship.html 我正在尝试执行的查询类型是: SELECT users.* FROM users LEFT JOIN users_relationships AS r ON ( users.id = r.user_id_1 AND r.user_id_1 != $user_id ) OR ( users.id = r.user_id_2 AND r.user_id_2 != $user_id ) WHERE r.status = 1 AND ( r.user_id_1 = $user_id OR r.user_id_2 = $user_id ) 这样的事情在一个雄辩的关系中是最好的,所以它很容易执行:$user->朋友,它会返回上面的结果,但我被困在各个方向. 遗憾的是,我最好的尝试是不使用关系: User::with('profile')->join('user_relationships as r',function($join) use ($user_id) { $join->on(DB::raw('( users.id = r.user_id_1 AND r.user_id_1 != ? )',[$user_id]),DB::raw(''),DB::raw('')); $join->orOn(DB::raw('( users.id = r.user_id_2 AND r.user_id_2 != ? )',DB::raw('')); }) ->where('r.status',1) ->where(function($query) use ($user_id) { $query->where('r.user_id_1',$user_id) ->orWhere('r.user_id_2',$user_id); }) ->get(['users.*']); 然而,这给了我与参数有关的错误: SQLSTATE[HY093]: Invalid parameter number (SQL: select `users`.* from `users` inner join `user_relationships` as `r` on ( users.id = r.user_id_1 AND r.user_id_1 != 1 ) or ( users.id = r.user_id_2 AND r.user_id_2 != 30 ) where `users`.`deleted_at` is null and `r`.`status` = 30 and (`r`.`user_id_1` = ? or `r`.`user_id_2` = ?)) 我不知道怎么做我想做的事. 解决方法
问题出在这里:
DB :: raw()不会为绑定采用第二个参数.使用 – > on() – > where()代替(感谢user4621032): ->leftJoin('users_relationships AS r',function($join) use($user_id) { $join->on('users.id','=','r.users_id_1')->where('r.users_id_1','!=',$user_id) ->orOn('users_id','r.users_id_2')->where('r.users_id_2',$user_id); }) 因此,要根据需要设置 – > friends()函数,您可以使用: public function friends() { $user_id = $this->id; return self::with('profile') ->leftJoin('users_relationships AS r',function($join) use($user_id) { $join->on('users.id',$user_id) ->orOn('users_id',$user_id); }) ->where('r.status',1) ->where(function($query) use ($user_id) { $query->where('r.user_id_1',$user_id) ->orWhere('r.user_id_2',$user_id); }) ->get(['users.*']); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |