得到计数与hasMany不工作yii2

时间:2018-05-10 02:41:23

标签: count yii2

我有CLub模型(俱乐部)hasMany与用户模型像

Club n-n用户

我的UserClub模型包含列:id, club_id, user_id,

在俱乐部模式中

public function getCountUsers()
{
    return $this->hasMany(UserClub::className(), ['club_id'=>'id'])->count();
}

我想把所有用户俱乐部计为代码:

$query = Club::find()
    ->joinWith(['countUsers']);
    // ->with('countUsers');
    ->all();

所以它不起作用并抛出错误

Club has no relation named \"countUsers\"."

3 个答案:

答案 0 :(得分:1)

因为它不是关系,因为它不返回模型对象或模型对象数组,而是使用->count()使它返回一个字符串,其中包含用户对照的总计数俱乐部。

如果您希望针对所有Clubs对用户进行计数,您可以使用当前定义的关系,例如$club->countUser,请参阅下文。

$clubs=Club::find()->all();

foreach($clubs as $club){
    echo $club->countUser;
}

或将关系更改为

public function getCountUser(){
    return $this->hasMany(UserClub::className(), ['club_id'=>'id']);
}

并像

一样使用它
$clubs=Club::find()->all();
foreach($clubs as $club){
    echo count($club->countUser);
}

或类似下面

$clubs=Club::find()->all();
foreach($clubs as $club){
    echo $club->getCountUser()->count();
}

EDIT

据我在讨论中所理解,您实际上是尝试使用ActiveRecord转换以下查询。

SELECT clubs.id, count(user_clubs.id) as total 
FROM 
clubs 
left join user_clubs on clubs.id = user_clubs.club_id 
group by clubs.id

如果这是正确的,您可以使用以下

Clubs::find ()
        ->alias ( 'c' )
        ->select ( [ new \yii\db\Expression ( 'c.[[id]], count(uc.[[id]]) as total' ) ] )
        ->leftJoin ( '{{%user_clubs}} uc' , 'uc.club_id=c.id' )
        ->groupBy ( 'c.id' )
        ->all ();

注意:您必须再做一件事,在public模型中添加$total属性Club并将其添加到{{1} }规则,因为您选择计数作为别名safe,除非您在模型中定义它,否则结果集不会显示计数,因此在total模型中添加以下内容。

Club

根据规则

public $total;

[[other fields...,'total'] , 'safe' ] ,

出于某种原因,我觉得您试图通过指定关系来计算,而不是在查询中使用表EDIT2指定->leftJoin ()

如果是这样,那么你必须改变你的关系user_clubs,你最好给出一个描述它的有意义的名字。我会将其重命名为getUserCount()

getClubUsers()

在此之后,您仍然必须按照我之前在public function getClubUsers(){ return $this->hasMany(UserClub::className(), ['club_id'=>'id']); } 模型中所述的方式声明公共属性$total,并将其添加到Club规则中。

现在您可以按以下方式编写查询

safe

答案 1 :(得分:0)

您可以使用join进行操作,在我的情况下,我得到的用户具有超过0个推荐。

$users = User::find()->with('referrals')
            ->from(User::tableName() . ' t')
            ->join('left join',User::tableName().' r','r.Deeplink = t.ReferralID')
            ->select('t.*,count(r.ID) as ct')
            ->groupBy('t.ID')
            ->andFilterHaving(['>','ct',0])
            ->all();

答案 2 :(得分:-1)

您的关系正确,请检查错误 Club has no relation named \"countUsers\"."

表示您正在调用不存在的关系: 像这样更改查询,关系名称应该在俱乐部模型中

public function getCount(){
 return $this->hasMany(UserClub::className(), ['club_id'=>'id'])->count();}

$query = Club::find()
    ->joinWith(['count']);
    // ->with('countusers');
    ->all(); 

如果你想要数,就这样做。 加载俱乐部模型。

$club_model =  Club::find()
$count = club_model->count;