回答

收藏

mysql加入ON和AND laravel雄辩

技术问答 技术问答 402 人阅读 | 0 人回复 | 2023-09-14

我已经能够使用以下原始sql获取查询结果:; ]" c6 R/ E9 v9 L6 r
select `person`.`id`, `full_name`, count(actions.user_id) as total
$ j! L. {: \+ ~, D  Rfrom `persons`- J$ A& [. f5 k9 a7 J1 Y9 C5 m! A
left join `actions`" }% s& d/ J. e; P
on `actions`.`person_id` = `persons`.`id` 4 D! V0 b: v4 j- ?3 Q
and `actions`.`user_id` = $user
! H2 `9 G/ |- g+ k7 N( J) Ywhere `type` = 'mp'
* v3 f: d. ], |2 J6 J; D& fgroup by `persons`.`id`9 j2 p  j# ~9 {+ Y* n1 u4 Z
但是我还不能使它雄辩地工作。$ x0 s* n1 N" u
根据一些类似的答案,我曾尝试在->where()或中执行功能leftJoin(),但count尚未过滤每个人的操作$user。就目前而言:6 V6 L4 y, ~1 Y3 D% s; |
$query = Person::leftJoin('actions', function($q) use ($user)
8 z5 s0 N6 j: o1 c2 p/ D        {
* U& a" m0 D7 X$ @" q6 `) Z5 D            $q->on('actions.person_id', 'persons.id'). w) T7 y4 y& p5 Z0 w
                ->where('actions.user_id', $user);
' Z# Y8 @8 o, L        }), L1 G0 F9 J$ K' {6 d$ x
        ->groupBy('persons.id')! W1 T. F1 I1 L+ t2 i
        ->where('type', 'foo')
$ C7 }. [: w8 c- `$ D. ^        //->where('actions.user_id', '=', $user), U! j' Y/ ?6 W6 c; n" ]' b
        ->get(['persons.id', 'full_name', DB::raw('count(actions.id) as total')]);$ L. ]% ]9 M% E! i/ g* ?; p8 N
我至少在标题 大致 正确的方向,正确的…?. G, m7 r! j' a. u
如果相关,则该Persons.php模型具有两个actions关系:
; G) D3 |% i$ J- k# V6 [+ c' |1 b* jpublic function actions()
/ _! K3 Z, }0 `0 w! c  |* G{3 }* R' r5 z& t9 ]+ j% h) v
    return $this->hasMany('Action');- r' |. T/ D0 {4 Z. j3 S9 ?
}/ v; t- f/ B. M- a' b9 e
public function actionsUser($id)
, A0 ]+ u0 M( I, n' ?{% W) t; h) w# T# a9 U& M" F; X
    return $this->hasMany('Action')->where('user_id', $id);
% R& R9 {  g7 d! L  K}1 W; Y- z  Y; x/ y
               
( B8 R4 ?* N! y9 j: ]! ?& E解决方案:
8 m3 ^1 ^5 q: G2 H$ X6 C                0 \) Y8 K1 s" H. Q, y* D
$ b: A' U% y1 U

- ~7 r- u- ?2 f+ Z; X9 u                因此,作为参考,我像这样解决了它:
/ j. |# I) O6 J9 }* A5 I$ P$query = Person::leftJoin('actions', function($q) use ($user)( q' C" D# y$ V4 o
        {3 B$ ~; b; L6 {7 d
            $q->on('actions.person_id', '=', 'persons.id')
$ y* o* R6 }$ ^                ->where('actions.user_id', '=', "$user");
8 M  T/ \: }4 f9 x        })1 @% w1 L+ e; d0 s! ^' g
        ->groupBy('persons.id')  O1 V0 w9 A# G$ y# x2 v
        ->where('type', 'foo')
2 S: x. G6 ^3 |; _; z* M        ->get(['persons.id', 'full_name', DB::raw('count(actions.id) as total')]);
% k9 v3 m; y* E, M+ [# S奇怪的是,其中的->where()子句leftJoin需要语音标记才能使变量正确通过sql查询(同样,“ 2”似乎不起作用,而“ 2”却可以)。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则