[英]Showing data from 2 models in a grid with Yii
我正在嘗試從兩個表中選擇數據並在分頁網格視圖中顯示該數據。 問題是 Yii 使用 SQL 連接來連接數據(因為我告訴它這樣做),因此它沒有顯示每頁正確的項目數。
為了清楚起見,我正在從topics
和messages_in_topics
選擇,然后我將加入
$criteria->together = true;
這使得 MySQL 為每條消息(和相關主題)返回一行。 例子:
id_topic topic id_messages message
1 topic1 1 message1_in_topic1
1 topic1 2 message2_in_topic1
1 topic1 3 message3_in_topic1
2 topic2 4 message1_in_topic2
2 topic2 5 message2_in_topic2
只有 2 個主題,但 Yii 的分頁器認為有 5 個。
“修復”這個問題的最快方法是按 id_topic 字段分組,無論如何,我不能這樣做,因為有一個 where 條件使用like
語句進行搜索。
謝謝
編輯:
這是我的操作代碼:
$criteria = new CDbCriteria;
$get_s = Yii::app()->request->getQuery('s', '');
if( $get_s ){
$criteria->compare("topic_title", $get_s, true);
$criteria->compare("message_text", $get_s, true, 'OR');
}
$criteria->with = array('messages');
$criteria->addCondition(array( ...... )); <--- some rules like if the topic is validated...
$dataProvider = new CActiveDataProvider('Topics', array(
'criteria'=>$criteria,
'pagination=>array('pageSize'=>15)
));
實際上,所顯示的信息與您的消息有關。 重復的主題值是因為這些主題是消息對應的相關數據。
您可以嘗試告訴您的查詢在結果中使用 GROUP BY ...
SELECT t.id_topic, t.topic, COUNT(m.id_messages)
FROM topics t LEFT JOIN messages m ON t.id_topic = m.id_topic
GROUP BY t.id_topic
這樣,或多或少,您可以顯示每個主題的消息數。 如果您向我們展示您的 SQL,我可以為您提供更多幫助。
編輯:看到你的代碼后,這是我的猜測: $criteria = new CDbCriteria;
$get_s = Yii::app()->request->getQuery('s', '');
if( $get_s ){
$criteria->compare("topic_title", $get_s, true);
$criteria->compare("message_text", $get_s, true, 'OR');
}
$criteria->with = array('messages');
$criteria->addCondition(array( ...... )); <--- some rules like if the topic is validated...
$dataProvider = new CActiveDataProvider('Topics', array(
'criteria'=>$criteria,
'pagination=>array('pageSize'=>15)
));
您可以通過僅使用 CDbCriteria 的三個基本屬性傾倒查詢來確保查詢不會被 yii 的格式復雜化:
此外,您還可以確保直接設置這些屬性,這樣您實際上將查詢分解為 CDbCriteria 對象。 例如:
SELECT t.id_topic, t.topic, COUNT(m.id_messages)
FROM topics t LEFT JOIN messages m ON t.id_topic = m.id_topic
GROUP BY t.id_topic
會是這樣
/*1*/ $criteria->select = 't.id_topic, t.topic, COUNT(m.id_messages)';
/*2*/ $criteria->condition = 't.topic_title LIKE %'.$get_s.'% OR ...';/* add your conditions here*/
/*3*/ $criteria->join = 'LEFT JOIN messages m ON t.id_topic = m.id_topic'; //Full join statement here, including the nature of the join.
/*4*/ $criteria->group = 't.id_topic';
重要提示:考慮到由於您將Topics
類名傳遞給CActiveDataProvider
構造函數, Topics
下的表將被稱為t
。 還必須在連接條件中指定任何其他表(非常類似於messages m
或messages AS m
),否則您可能會收到column xxxx is ambiguous
警告。
對於您可能遇到的任何問題,不要錯過關注CDbCriteria和CActiveDataProvider的機會。
問題不在於分頁器,而在於您的查詢。 如果您運行查詢:
SELECT *
FROM topics as t
INNER JOIN messages_in_topics as mt
ON mt.topics_id = t.id
INNER JOIN messages as m
ON m.id = mt.messages_id
您將獲得 5 個結果,如上面的示例所示。
所以更重要的是,你想做什么?
此外,您的表顯示了 MANY_MANY 關系(message1 有 2 個主題,topic1 有 3 個消息),您的數據庫設置是否正確,您的模型關系是否相應配置?
您是否試圖在一行中顯示每個主題中的所有消息?
您是否要顯示所有主題並列出帶有該主題的每條消息?
假設你的關系設置正確,你可以使用: $messages=$topics->messages;
並獲取一個包含所有列出的消息的數組。
相反,您可以執行$topics=$messages->topics;
獲取主題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.