Yii2照相馆光电>喜欢的关系

问题描述 投票:1回答:2

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

php mysql yii2
2个回答
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()只得到照片的具体结果集,如果你想在某处未来。

希望能帮助到你。


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
© www.soinside.com 2019 - 2024. All rights reserved.