2016-06-29 1 views
2

Dans mon projet Yii2 j'ai les tables post et post_views, et un modèle Post.Tri par données jointes Yii2

Il y a 2 champs post_views:

  • post_id
  • views_counter

J'utilise PostSearch et PostsQuery (ActiveQuery) pour mes requêtes.

Ma tâche est: Je dois obtenir tous mes messages avec le champ personnalisé views où j'obtiens views_counter de post_views.

Je n'utilise pas hasMany dans le modèle parce qu'il n'y a pas de modèle pour la table post_views dans le projet et je préférerais ne pas le créer si possible. Aussi, j'ai besoin de trier mes messages par views domaine. Je suis bloqué sur ceci:

public function topPosts(){ 
    $junction_table = '{{%post_views}}'; 
    return $this->innerJoin($junction_table, Post::tableName().'.id='.$junction_table.'.post_id'); 
} 

Le problème principal est que je ne sais pas comment joindre et renvoyer des données correctement. J'ai besoin de cette requête:

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

Juste pour la curiosité ... puis-je demander pourquoi la colonne 'views_counter' ne fait pas partie de la table' post'? Je ne vois aucune raison de ne pas être. – Clyff

+0

Je pense qu'il pourrait y avoir plus de colonnes à l'avenir, donc j'ai décidé de les diviser –

Répondre

2

D'abord, vous devez mettre à jour votre modèle Post avec le champ Viewcount:

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; 
    } 
} 

Ensuite, vous devez inclure champ Viewcount dans la liste de sélection comme ceci:

$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(); 
+0

celui-ci fonctionne, merci –

+1

@MaximBelyaev Si vous voulez dire "merci", votez ou [accepter] (http://stackoverflow.com/help/accepted-answer) réponse de cette personne. Plus loin lire: [Que dois-je faire quand quelqu'un répond à ma question?] (Http://stackoverflow.com/help/someone-answers) –

+0

J'ai effectivement voté dessus :) merci à vous aussi –