回答

收藏

mysql加入ON和AND laravel雄辩

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

我已经能够使用以下原始sql获取查询结果:% I8 T2 m" x9 S' W2 a
select `person`.`id`, `full_name`, count(actions.user_id) as total* ~) c: f3 u5 M
from `persons`+ x# t1 e, F4 b$ b# ?. P
left join `actions`
* |5 a4 i* n+ von `actions`.`person_id` = `persons`.`id`
" H" Q8 C" Y/ \. rand `actions`.`user_id` = $user% Y7 u, L% u! i! @
where `type` = 'mp'
9 R+ P. ?/ j3 e1 D" X, s9 bgroup by `persons`.`id`! d7 z5 U1 U* o# A$ Z
但是我还不能使它雄辩地工作。
* |- i$ G. c8 u根据一些类似的答案,我曾尝试在->where()或中执行功能leftJoin(),但count尚未过滤每个人的操作$user。就目前而言:6 ~; Y* A+ @+ e" p$ \: T% E* ]
$query = Person::leftJoin('actions', function($q) use ($user)
( l+ h+ e; H. S0 B) _8 S) _( d        {1 T" q, b6 B* z
            $q->on('actions.person_id', 'persons.id')) w  n2 o, \4 G; u  U9 _+ F# ^
                ->where('actions.user_id', $user);3 Y! a; i; e* o% X2 P3 }8 d
        })9 S2 s% ]# s8 U! s
        ->groupBy('persons.id')
5 f) M2 F( b) p% Y( b# u        ->where('type', 'foo')
( u3 D9 h/ V$ P        //->where('actions.user_id', '=', $user)
9 S. m+ @! k9 ]- V        ->get(['persons.id', 'full_name', DB::raw('count(actions.id) as total')]);6 J6 n$ m) L- m  r3 [* J7 v
我至少在标题 大致 正确的方向,正确的…?* B, A# X1 T3 E4 `8 e: U
如果相关,则该Persons.php模型具有两个actions关系:; b' F4 `% g5 {% ]  y' F
public function actions()3 s% ]2 M5 z% I* ^3 _' F
{, \/ w" Z& U" J% [
    return $this->hasMany('Action');
, m- f% v( _5 ?6 O" ?# [( a}+ C/ n* J  n( F0 Z2 `( [
public function actionsUser($id)
: r% V. Y; c% X{2 U9 a8 a( d6 s
    return $this->hasMany('Action')->where('user_id', $id);
* O4 Z8 `) G! \/ E% d}
, |8 y$ q# w5 h7 |5 C2 \2 N               
& P1 r# e0 C" j) a6 ]  U解决方案:+ f5 T+ q2 Y4 X/ S
               
+ U: _0 n9 b, S, E, d, L, f4 O& H' ~2 p3 N# z. G3 s' |
+ Y/ E2 y9 j3 H9 h( r3 w; z+ R
                因此,作为参考,我像这样解决了它:( H$ F* J; L5 m4 b) P' U/ h3 P" [
$query = Person::leftJoin('actions', function($q) use ($user)
) e& ?0 O8 C0 X$ b        {% N1 R6 B- K# s
            $q->on('actions.person_id', '=', 'persons.id')6 j# d& F9 Y, d# h
                ->where('actions.user_id', '=', "$user");
1 y: f- k+ k6 z9 G" e        }): k) C0 [9 N0 n# u/ q# m
        ->groupBy('persons.id')
3 ]7 j7 [9 g! ^. {$ s( x: D% W        ->where('type', 'foo')
2 m! f+ T/ k, L, e        ->get(['persons.id', 'full_name', DB::raw('count(actions.id) as total')]);
" g! \' L5 O, T$ [4 J3 m9 i0 S奇怪的是,其中的->where()子句leftJoin需要语音标记才能使变量正确通过sql查询(同样,“ 2”似乎不起作用,而“ 2”却可以)。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则