升级1.3后 - > 2.4:find()不加入关联模型

时间:2013-11-15 10:55:45

标签: cakephp join find cakephp-2.0 cakephp-1.3

我最近使用https://github.com/dereuromark/upgrade将我的1.3-app升级到2.4 但现在 $ this->模型 - > find()的一些用法不起作用。特别是与相关模型/表格的连接。
导致where子句中的“未知列”Bill.customer_id'。

我的设置:

表格和关联http://i.stack.imgur.com/bjOIz.png (图片)

模型

App::uses('AppModel', 'Model');
class Customer extends AppModel {
public $actsAs = array('Logable', 'Containable');
public $hasMany = array(
    'Bill' => array(
        'className' => 'Bill',
        'foreignKey' => 'customer_id',
        'dependent' => false,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'exclusive' => '',
        'finderQuery' => '',
        'counterQuery' => ''
    )...
-----------------------------------------------------------------
App::uses('AppModel', 'Model');
class Bill extends AppModel {
public $actsAs = array('Containable', 'Logable', 'Lockable');

public $belongsTo = array(
    'Customer' => array(
        'className' => 'Customer',
        'foreignKey' => 'customer_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )...

public $hasAndBelongsToMany = array(
    'Stage' => array(
        'className' => 'Stage',
        'joinTable' => 'bills_stages',
        'foreignKey' => 'bill_id',
        'associationForeignKey' => 'stage_id',
        'unique' => true,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    )...
--------------------------------------------------------------
App::uses('AppModel', 'Model');
class BillsStage extends AppModel {
public $actsAs = array('Containable', 'Logable', 'Lockable');

public $belongsTo = array(
    'Bill' => array(
        'className' => 'Bill',
        'foreignKey' => 'bill_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'Stage' => array(
        'className' => 'Stage',
        'foreignKey' => 'stage_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
)...
--------------------------------------------------------
App::uses('AppModel', 'Model');
class Stage extends AppModel {
public $displayField = 'name';
public $actsAs = array('Tree', 'Containable', 'Logable');

public $hasMany = array(
    'Bill' => array(
        'className' => 'Bill',
        'foreignKey' => 'stage_id',
        'dependent' => false,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'exclusive' => '',
        'finderQuery' => '',
        'counterQuery' => ''
    )...

public $hasAndBelongsToMany = array(
    'Bill' => array(
        'className' => 'Bill',
        'joinTable' => 'bills_stages',
        'foreignKey' => 'stage_id',
        'associationForeignKey' => 'bill_id',
        'unique' => true,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    )...

在1.3中,连接工作正常。在2.4中只有1维sql查询。

有什么想法吗?

- 修改 -

$billsStages = $this->Customer->Bill->BillsStage->find('all', array(
  'conditions' => array(
      'Bill.customer_id' => $this->Customer->id,
      'Stage.id' => array_keys($vk_stages)
    ),
  'order' => 'BillsStage.created DESC'
));

1 个答案:

答案 0 :(得分:0)

尝试加入(例如从docs中取出)

$options['joins'] = array(
    array('table' => 'bills',
        'alias' => 'Bill',
        'type' => 'LEFT',
        'conditions' => array(
            'Bill.customer_id' => $this->Customer->id,
        )
    ),
    array('table' => 'stages',
        'alias' => 'Stage',
        'type' => 'LEFT',
        'conditions' => array(
            'Stage.id' => array_keys($vk_stages)
        )
    )
);

$options['conditions'] = array();

$items= $this->Customer->Bill->BillsStage->find('all', $options);

(根据你的情况调整)。

根据this answer,无法在辅助模型上使用contain条件,因为contain会生成不同的查询。因此,如果要在辅助模型上应用条件,或者在模型中创建一个执行两个单独查询的简单函数,则创建一个宏数组,如果要使用contain,则返回混合结果。