簡體   English   中英

使用 Yii 在網格中顯示來自 2 個模型的數據

[英]Showing data from 2 models in a grid with Yii

我正在嘗試從兩個表中選擇數據並在分頁網格視圖中顯示該數據。 問題是 Yii 使用 SQL 連接來連接數據(因為我告訴它這樣做),因此它沒有顯示每頁正確的項目數。

為了清楚起見,我正在從topicsmessages_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 的格式復雜化:

  1. $criteria->select正是您要選擇的列列表。
  2. $criteria->condition正是 WHERE 條件,老實說,我更喜歡使用字符串而不是數組,因為使用字符串允許我使用我在這里輸入的確切條件。
  3. $criteria->join緊接在您在 CActiveDataProvider 構造函數中指定的 $model->tableName() 之后。
  4. $criteria->group添加在查詢的最后,你只需要指定分組列。

此外,您還可以確保直接設置這些屬性,這樣您實際上將查詢分解為 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 mmessages AS m ),否則您可能會收到column xxxx is ambiguous警告。

對於您可能遇到的任何問題,不要錯過關注CDbCriteriaCActiveDataProvider的機會。

問題不在於分頁器,而在於您的查詢。 如果您運行查詢:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM