当我尝试使用CDbCriteria获取结果时,它不会给我预期的结果,就像我在phpmyadmin中运行由CDbCriteria生成的相同查询一样,然后我得到结果。我不明白发生了什么。
标准如下: -
$criteria = new CDbCriteria();
$criteria->select = 't.*c.*' ;
$criteria->join = 'LEFT OUTER JOIN `flight_cancel` as `c` on t.ticket_id = c.ticket_id';
$criteria->compare('t.booking_id', $bookingId);
$data = FlightTicket::model()->findAll($criteria);
而查询是
SELECT t.*c.* FROM `flight_ticket` `t` LEFT OUTER JOIN `flight_cancel` as `c` on
t.ticket_id = c.ticket_id WHERE t.booking_id= 'something'
使用CDbCriteria时它只返回flight_ticket数据而不是flight_cancel数据。
我做错了什么?
答案 0 :(得分:2)
$data = FlightTicket::model()->findAll($criteria);
只会返回FlightTicket
条记录。由于flight_cancel
在FlightCancel
中有一个ActiveRecord类说flightCancel
和一个关系FlightTicket
,您可以更改您的条件以包含此内容:
$criteria = new CDbCriteria();
$criteria->together = true; // perform eager loading
$criteria->with = array('flightCancel' => array('joinType'=>'left outer join'));
$criteria->compare('t.booking_id', $bookingId);
$data = FlightTicket::model()->findAll($criteria);
然后,您可以通过FlightCancel
(或$model->flightCancel
获取一对多的关系)访问$model->flightCancel[]
数据,其中$model
是FlightTicket
条记录
修改强>
AR依赖于明确定义的表的主键。如果表没有 有一个主键,它需要相应的AR类 通过覆盖指定哪个列应该是主键 primaryKey()方法如下,
public function primaryKey() { return 'id'; // For composite primary key, return an array like the following // return array('pk1', 'pk2'); }
因此,如果没有主键,最好使用CDbCommand::queryAll()
将查询结果作为结果行数组返回。