【问题标题】:CdbCriteria is not giving Join resultsCdbCriteria 没有给出加入结果
【发布时间】:2023-03-16 01:32:01
【问题描述】:

当我尝试使用 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 数据。

我做错了什么??

【问题讨论】:

  • flight_cancel 有 ActiveRecord 类吗?如果是这样,您是否将其定义为FlightTicket 的关系?
  • 是的 .. flight_cancel 有一个 activerecord 类,是的,我也定义了关系
  • 你的代码 FlightTicket::model()->findAll($criteria); 会给你FlightTicket ActiveRecords
  • 是的.. 那么我怎样才能用它来获取相关的表记录呢?

标签: php yii criteria


【解决方案1】:

$data = FlightTicket::model()->findAll($criteria); 将仅返回 FlightTicket 记录。由于flight_cancel 有一个ActiveRecord 类,比如FlightCancelflightCancelFlightTicket 中的一个关系,你可以改变你的标准来包括这个:

$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);

然后您可以通过$model->flightCancel(或一对多关系的$model->flightCancel[])访问您的FlightCancel 数据,其中$modelFlightTicket 记录。

编辑

来自yii database guide

AR 依赖于明确定义的表主键。如果表没有 有主键,需要对应的AR类 通过覆盖指定哪些列应该是主键 primaryKey() 方法如下,

public function primaryKey()
{
    return 'id';
    // For composite primary key, return an array like the following
    // return array('pk1', 'pk2');
}

因此,如果没有主键,最好使用CDbCommand::queryAll() 将查询结果作为结果行数组返回。

【讨论】:

  • 问题是我在 flight_cancel 表中没有主键字段。所以每当我尝试使用它时都会抛出错误
  • 我已更新答案以反映缺少主键。
猜你喜欢
  • 2018-11-30
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多