因此,基本上,我有一个照片应用程序,照片和喜欢之间的关系为hasMany()
。如何使count(number_of_likes)
对每张照片进行排序?
TABLE `Likes` (
`id_lk` int(11) NOT NULL AUTO_INCREMENT,
`idusr_lk` int(11) NOT NULL,
`idpht_lk` int(11) NOT NULL,
PRIMARY KEY (`id_lk`),
KEY `idusr_lk` (`idusr_lk`),
KEY `idpht_lk` (`idpht_lk`),
CONSTRAINT `Likes_ibfk_1` FOREIGN KEY (`idusr_lk`) REFERENCES `users_usr` (`id_usr`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `Likes_ibfk_2` FOREIGN KEY (`idpht_lk`) REFERENCES `photos_pht` (`id_pht`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
关系的php代码: 照片模型
public function getLikes()
{
return $this->hasMany(Likes::className(), ['idpht_lk' => 'id_pht']);
}
喜欢模特
public function getPhoto()
{
return $this->hasOne(Photo::className(), ['id_pht' => 'idpht_lk']);
}
我知道您可以在关系后添加一个orderBy
子句,但是我只是不知道是否允许在那儿写SQL查询,如果可以,应该怎么写呢? ?
答案 0 :(得分:1)
那么你需要什么,你不必手动每次,仍然能够调用具有
结果集,以构建查询与喜欢他们已经使用现有的关系的数量沿所有图片getLikes()
。
应该根据喜欢的次数对他们进行排序。
好吧,我建议不要只使用Photo::find()->all()
来完成这项工作,但是可以,如果您可以接受Photo::find()->byLikes()->all()
,那么可以使用以下方法
ActiveQuery
模型创建PhotoQuery
类Photo
。find()
模型中的Photo
方法,以使用新生成/创建的PhotoQuery
类。可以使用Gii
,以产生默认PhotoQuery
类,也可以创建手动像下方的一个。
相应地调整的命名空间。
<?php
namespace app\models;
/**
* This is the ActiveQuery class for [[Photo]].
*
* @see Photo
*/
class PhotoQuery extends \yii\db\ActiveQuery
{
/**
* {@inheritdoc}
* @return Photo[]|array
*/
public function all($db = null)
{
return parent::all($db);
}
/**
* {@inheritdoc}
* @return Photo|array|null
*/
public function one($db = null)
{
return parent::one($db);
}
}
现在,你需要做的是在添加新的方法PhotoQuery
名为byLikes()
/**
* @return mixed
*/
public function byLikes()
{
return $this->alias('p')
->select(['p.*', new \yii\db\Expression('count(l.idpht_lk) as likeCount')])
->joinWith(['likes l'])
->groupBy('p.id_pht')
->orderBy('likeCount desc');
}
和然后在Photo
模型来使用PhotoQuery
类别实例添加以下方法。
/**
* {@inheritdoc}
* @return PhotoQuery the active query used by this AR class.
*/
public static function find()
{
return new PhotoQuery(get_called_class());
}
现在,您可以像调用Photo::find()->byLikes()->all()
一样调用查询,它将返回按喜欢总数和排序的次数排序的结果,同时您仍然可以调用Photo::find()->all()
仅获得如果你想在未来的某个特定的照片结果集。
希望有帮助。
答案 1 :(得分:0)
在表Likes
中,您必须添加一个字段,可以在其中存储每张照片的赞数,例如:number_of_likes
。
然后,您可以运行这样的查询,以按降序获取每张照片的赞数:
SELECT idusr_lk, idpht_lk, number_of_likes
FROM photos_pht
INNER JOIN Likes
ON photos_pht.id_pht = Likes.idpht_lk
ORDER BY Likes.number_of_likes DESC