我有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\"."
答案 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;