[英]Yii condition relations issue
我在Yii條件上遇到麻煩。
我的代碼:
$criteria=new CDbCriteria;
//$criteria->together = true;
$criteria->group='t.id';
$criteria->with = array('farmer_goods','goods_catalog');
//$criteria->compare('farmer_goods.price', '<>0');
$criteria->compare('goods_catalog.name', $this->_params['category']);
在這種情況下,它可以按我想要的方式工作(我獲取項目列表,每個項目都有擁有它們的農民列表,並且與此項目相關的1個類別。
但是問題是我需要按照存儲在農戶表中的商品的價格對列表進行排序。
因此,如果我取消注釋此行:
//$criteria->compare('farmer_goods.price', '<>0');
我得到:
SELECT `t`.`id` AS `t0_c0`, `t`.`catalog_id` AS `t0_c1`, `t`.`articul` AS `t0_c2`, `t`.`###name` AS `t0_c3`, `t`.`name_rus` AS `t0_c4`, `t`.`ed_izm` AS `t0_c5`, `t`.`srok_godnosti` AS `t0_c6`, `t`.`temp_hraneniya` AS `t0_c7`, `t`.`belki` AS `t0_c8`, `t`.`jiri` AS `t0_c9`, `t`.`uglevodi` AS `t0_c10`, `t`.`kalorii` AS `t0_c11`, `t`.`gost` AS `t0_c12`, `t`.`photo` AS `t0_c13`, `t`.`opisanie` AS `t0_c14`, `goods_catalog`.`id` AS `t2_c0`, `goods_catalog`.`parent_id` AS `t2_c1`, `goods_catalog`.`unique_name` AS `t2_c2`, `goods_catalog`.`name` AS `t2_c3`, `goods_catalog`.`name_rus` AS `t2_c4`, `goods_catalog`.`rout_url` AS `t2_c5`, `goods_catalog`.`launch_model` AS `t2_c6`, `goods_catalog`.`photo` AS `t2_c7` FROM `goods_details` `t` LEFT OUTER JOIN `goods_catalog` `goods_catalog` ON (`t`.`catalog_id`=`goods_catalog`.`id`) WHERE (((farmer_goods.price LIKE :ycp0) AND (farmer_goods.price<>:ycp1)) AND (goods_catalog.name=:ycp2)) GROUP BY t.id LIMIT 50
您會看到沒有與農民合作的機會:
FROM `goods_details` `t` LEFT OUTER JOIN `goods_catalog` `goods_catalog` ON (`t`.`catalog_id`=`goods_catalog`.`id`)
如果我沒有評論:
//$criteria->together = true;
它解決了這個問題,但作為回應,我得到了1個農夫的清單(那不是我想要的)
我想我必須在准則中執行某種准則,但是如何?
我的var_dump(); 有2條評論行
object(GoodsDetails)#88 (11) {
["_attributes":"CActiveRecord":private]=>
array(15) {
["id"]=>
string(1) "1"
["catalog_id"]=>
string(1) "1"
["articul"]=>
string(6) "myaso1"
["###name"]=>
string(4) "meet"
["name_rus"]=>
string(29) "Мяско вкуснящее"
["ed_izm"]=>
string(1) "1"
["srok_godnosti"]=>
string(2) "14"
["temp_hraneniya"]=>
string(4) "0±2"
["belki"]=>
string(4) "13.7"
["jiri"]=>
string(4) "36,5"
["uglevodi"]=>
string(8) "uglevodi"
["kalorii"]=>
string(4) "384"
["gost"]=>
string(13) "Р 53221-2008"
["photo"]=>
string(371) "{"main":0,"images":[{"title":"pic","url":["images\/title_01.jpg","images\/title_02.jpg","images\/title_03.jpg","images\/title_04.jpg"]},{"title":"pic2","url":["images\/title_11.jpg","images\/title_12.jpg","images\/title_13.jpg","images\/title_14.jpg"]},{"title":"pic2","url":["images\/title_21.jpg","images\/title_22.jpg","images\/title_23.jpg","images\/title_24.jpg"]}]}"
["opisanie"]=>
string(98) "zxc"
}
["_related":"CActiveRecord":private]=>
array(2) {
["farmer_goods"]=>
array(5) {
[0]=>
object(FarmersGoods)#93 (11) {
["_attributes":"CActiveRecord":private]=>
array(7) {
["id"]=>
string(1) "1"
["farmer_id"]=>
string(1) "1"
["articul"]=>
string(6) "myaso1"
["price"]=>
string(1) "0"
["fasovka"]=>
string(9) "[1,3,4,5]"
["fasovka_options"]=>
NULL
["count_left"]=>
NULL
}
}
[1]=>
object(FarmersGoods)#94 (11) {
["_attributes":"CActiveRecord":private]=>
array(7) {
["id"]=>
string(1) "2"
["farmer_id"]=>
string(1) "3"
["articul"]=>
string(6) "myaso1"
["price"]=>
string(5) "20.99"
["fasovka"]=>
string(4) "3543"
["fasovka_options"]=>
NULL
["count_left"]=>
NULL
}
}
[2]=>
object(FarmersGoods)#95 (11) {
["_attributes":"CActiveRecord":private]=>
array(7) {
["id"]=>
string(1) "3"
["farmer_id"]=>
string(1) "4"
["articul"]=>
string(6) "myaso1"
["price"]=>
string(5) "35.60"
["fasovka"]=>
string(4) "3543"
["fasovka_options"]=>
NULL
["count_left"]=>
NULL
}
}
[3]=>
object(FarmersGoods)#96 (11) {
["_attributes":"CActiveRecord":private]=>
array(7) {
["id"]=>
string(1) "4"
["farmer_id"]=>
string(1) "5"
["articul"]=>
string(6) "myaso1"
["price"]=>
string(2) "50"
["fasovka"]=>
string(11) "[1,2,2.5,5]"
["fasovka_options"]=>
NULL
["count_left"]=>
NULL
}
}
[4]=>
object(FarmersGoods)#97 (11) {
["_attributes":"CActiveRecord":private]=>
array(7) {
["id"]=>
string(1) "5"
["farmer_id"]=>
string(1) "6"
["articul"]=>
string(6) "myaso1"
["price"]=>
string(5) "50.10"
["fasovka"]=>
string(3) "123"
["fasovka_options"]=>
NULL
["count_left"]=>
NULL
}
}
}
["goods_catalog"]=>
object(GoodsCatalog)#89 (11) {
["_new":"CActiveRecord":private]=>
bool(false)
["_attributes":"CActiveRecord":private]=>
array(8) {
["id"]=>
string(1) "1"
["parent_id"]=>
string(1) "6"
["unique_name"]=>
NULL
["name"]=>
string(4) "meet"
["name_rus"]=>
string(8) "Мясо"
["rout_url"]=>
NULL
["launch_model"]=>
NULL
["photo"]=>
NULL
}
}
}
}
我的關系
'farmer_goods'=>array(self::HAS_MANY, 'FarmersGoods', array('articul'=>'articul')),
'goods_catalog'=>array(self::BELONGS_TO, 'GoodsCatalog', array('catalog_id'=>'id')),
編輯
通過phpmyadmin手動發布SQL查詢會產生很好的結果
SELECT
`t`.`id` AS `t0_c0`,
`t`.`catalog_id` AS `t0_c1`,
`t`.`articul` AS `t0_c2`,
`t`.`###name` AS `t0_c3`,
`t`.`name_rus` AS `t0_c4`,
`t`.`ed_izm` AS `t0_c5`,
`t`.`srok_godnosti` AS `t0_c6`,
`t`.`temp_hraneniya` AS `t0_c7`,
`t`.`belki` AS `t0_c8`,
`t`.`jiri` AS `t0_c9`,
`t`.`uglevodi` AS `t0_c10`,
`t`.`kalorii` AS `t0_c11`,
`t`.`gost` AS `t0_c12`,
`t`.`photo` AS `t0_c13`,
`t`.`opisanie` AS `t0_c14`,
`farmer_goods`.`id` AS `t1_c0`,
`farmer_goods`.`farmer_id` AS `t1_c1`,
`farmer_goods`.`articul` AS `t1_c2`,
`farmer_goods`.`price` AS `t1_c3`,
`farmer_goods`.`fasovka` AS `t1_c4`,
`farmer_goods`.`fasovka_options` AS `t1_c5`,
`farmer_goods`.`count_left` AS `t1_c6`,
`goods_catalog`.`id` AS `t2_c0`,
`goods_catalog`.`parent_id` AS `t2_c1`,
`goods_catalog`.`unique_name` AS `t2_c2`,
`goods_catalog`.`name` AS `t2_c3`,
`goods_catalog`.`name_rus` AS `t2_c4`,
`goods_catalog`.`rout_url` AS `t2_c5`,
`goods_catalog`.`launch_model` AS `t2_c6`,
`goods_catalog`.`photo` AS `t2_c7`
FROM
`goods_details` `t`
LEFT OUTER JOIN
`farmers_goods` `farmer_goods`
ON
(`farmer_goods`.`articul`=`t`.`articul`)
LEFT OUTER JOIN
`goods_catalog` `goods_catalog`
ON
(`t`.`catalog_id`=`goods_catalog`.`id`)
WHERE
(`goods_catalog`.`name`='meet')
GROUP BY `t`.`id`
ORDER BY `farmer_goods`.`price`
但是當Yii sort這樣啟動時
$sort = new CSort('FarmersGoods');
$sort->attributes = array(
'price'=>array(
'asc'=>'farmer_goods.price ASC',
'desc'=>'farmer_goods.price DESC',
),
'*',
);
它“丟失”:
LEFT OUTER JOIN
`farmers_goods` `farmer_goods`
ON
(`farmer_goods`.`articul`=`t`.`articul`)
我發現了一個問題,我真的希望可以幫助像我這樣的人,並BELONGS_TO
他們的時間,所以重點是,當您對BELONGS_TO
或HAS_ONE
進行排序時,使用BELONGS_TO
HAS_ONE
有問題
$criteria=new CDbCriteria;
$criteria->group='t.id';
$criteria->with = array('farmer_goods');
並像
$sort = new CSort('FarmersGoods');
$sort->attributes = array(
'price'=>array(
'asc'=>'farmer_goods.price ASC',
'desc'=>'farmer_goods.price DESC',
),
);
但是,當您需要對HAS_MANY(可能還有MANY_MANY,未經過測試)進行排序時,則需要這樣編寫條件
$criteria=new CDbCriteria;
$criteria->group='t.id';
$criteria->with = array('farmer_goods'=>array('together'=>true),'goods_catalog');
這不是很明顯,但是HAS_MANY
重要,可以讓您按相關的HAS_MANY
表屬性進行排序
btw-對不起,我的英語不好
來自烏克蘭的運氣
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.