【问题标题】:Nested select with left join in yii ActiveRecordyii ActiveRecord中带有左连接的嵌套选择
【发布时间】:2014-04-25 01:13:15
【问题描述】:

我有几张桌子。主表为contractors,并有一个链接表address,其中有某类地址(1, 2, 3)。在做LEFT JOIN ORDER BY type 时需要,因为在某些情况下,可能会使用1 以及2 或3 类型的地址,但有时地址在字段type 中不连续。 我提出了一个满足我要求的请求,但无法在 ActiveRecord 中创建相同的查询。

所以我直接在数据库中的请求是这样的:

SELECT t.id, addresses.address FROM contractor as t
    LEFT JOIN (SELECT * FROM address ORDER BY address.type) as addresses 
    ON addresses.address != '' AND addresses.contractor_id = t.id
    WHERE ((t.type='store') AND (t.name LIKE '%name%' OR addresses.address LIKE '%name%'))
    GROUP BY t.id

在模型关系中,现在看起来:

public function relations(){
  'addresses' => array(
      self::HAS_MANY,
      'Address',
      'contractor_id',
      'on' => "addresses.address != ''",
      'order' => 'addresses.type ASC'
   ),
}

我想澄清一下:我只能使用ActiveRecord

【问题讨论】:

    标签: php mysql yii


    【解决方案1】:

    我建议你用这个简单的方法

    $criteria = new CDbCriteria;
    $criteria->join = 'LEFT JOIN (SELECT * FROM address ORDER BY address.type) as addresses
    ON addresses.address != "" AND addresses.contractor_id = t.id';
    $criteria->condition = 't.type=:type AND (t.name LIKE :name OR addresses.address LIKE :name))';
    $criteria->params = ['type'=>$type, 'name'=>'%'.$name.'%'];
    $criteria->group = 't.id';
    $models = Contractor::model()->findAll($criteria);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-04
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-28
      相关资源
      最近更新 更多