在我的Yii2项目中,我有post
和post_views
个表格以及Post
模型。
post_views
中有2个字段:
post_id
views_counter
我使用PostSearch
和PostsQuery
(ActiveQuery)进行查询。
我的任务是:我需要使用自定义字段views
获取我的所有帖子,我从views_counter
获取post_views
。
我没有在模型中使用hasMany
,因为项目中没有post_views
表的模型,如果可能的话我不想创建它。另外,我需要按views
字段对帖子进行排序。我坚持这个:
public function topPosts(){
$junction_table = '{{%post_views}}';
return $this->innerJoin($junction_table, Post::tableName().'.id='.$junction_table.'.post_id');
}
主要问题是我不知道如何正确加入和返回数据。 我需要这个查询:
SELECT p.*, pv.views_count FROM posts p INNER JOIN post_views pv ON p.id = pv.post_id ORDER BY pv.views_count DESC;
答案 0 :(得分:2)
首先,您需要使用viewCount字段更新Post模型:
class Post extends \yii\db\ActiveRecord
{
private $viewCount;
public static function tableName()
{
return "posts";
}
public function setViewCount($viewCount)
{
$this->viewCount = $viewCount;
}
public function getViewCount()
{
return $this->viewCount;
}
}
然后你需要在选择列表中包含viewCount字段,如下所示:
$post = new Post();
$query = $post->find()
->alias('p')
->select(['p.*', 'pv.views_count viewCount'])
->innerJoin("post_views pv", "p.Id = pv.id")
->limit(100)
->orderBy(["pv.views_count" => SORT_DESC]);
//Get SQL query string
echo $query->createCommand()->getSql();
//Execute query
$result = $query->all();