Yii2照片集集Photo->喜欢的关系

时间:2019-02-01 15:48:28

标签: php mysql yii2

因此,基本上,我有一个照片应用程序,照片和喜欢之间的关系为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查询,如果可以,应该怎么写呢? ?

2 个答案:

答案 0 :(得分:1)

那么你需要什么,你不必手动每次,仍然能够调用具有

结果集,以构建查询
  • 与喜欢他们已经使用现有的关系的数量沿所有图片getLikes()

  • 应该根据喜欢的次数对他们进行排序。

好吧,我建议不要只使用Photo::find()->all()来完成这项工作,但是可以,如果您可以接受Photo::find()->byLikes()->all(),那么可以使用以下方法

  • ActiveQuery模型创建PhotoQueryPhoto
  • 覆盖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