CakePHP使用HABTM在find()中的多个模型条件

时间:2010-11-03 01:20:49

标签: cakephp join has-and-belongs-to-many

我的架构有以下关系:

User hasMany Transaction belongsTo User 
Item hasMany Transaction belongsTo Item
User hasManyAndBelongsTo Item using Transaction as join table 

我想将属于的给定商品符号的所有商品返回给定的用户ID 。我可以使用

检索属于该用户的所有项目
$this->User->find('all', array( 'conditions' => 
    array( 'User.id' => $userId ) ) )

我可以使用

检索具有给定项目名称的所有项目
$this->Item->find( 'all', array( 'conditions =>
    array( 'Item.symbol' => $itemSymbol ) );

但如果我尝试在$ this-> Item-> find(),$上使用条件数组('Item.symbol'=> $ itemSymbol,'User.id'=> $ userId) this-> Item-> User-> find(),$ this-> User-> find(),或$ this-> User-> Item-> find(),我得到错误

SQL Error: 1054: Unknown column 'Item.id' in 'where clause'

SQL Error: 1054: Unknown column 'Item.symbol' in 'where clause'

我已经在所有版本的食谱中吞噬了HABTM,并阅读了数十篇有关它的论坛/ SO帖子,但我没有幸运地形成这个查询。

相关信息: // User.php关联

// a user hasMany transactions
     var $hasMany = array('Transaction' =>
      array('className' => 'Transaction',
      'order' => 'Transaction.created DESC', // order by descending time of transaction
      //'limit' => '1', // change this if we need more, for example, if we need a user transaction history
      'foreignKey' => 'user_id',
      )
      ); 
    // a user hasAndBelongsTo items through transactions
    var $hasAndBelongsToMany = array('Item' =>
        array('className' => 'Item',
            'joinTable' => 'transactions',
            'foreignKey' => 'user_id',
            'associationForeignKey' => 'item_id',
            'order' => '',
            'limit' => '',
            'unique' => true,
            'finderQuery' => '',
            'deleteQuery' => '',
        )
    );

// Item.php association

var $hasMany = array('Transaction' =>
        array('className' => 'Transaction',
            'order' => 'Transaction.created DESC',
            //'limit' => '1', // change this if we need more, for example, if we need a item transaction history
            'foreignKey' => 'item_id',
        )
    );
    // a item hasAndBelongsTo users through transactions
    var $hasAndBelongsToMany = array('User' =>
        array('className' => 'User',
            'joinTable' => 'transactions',
            'foreignKey' => 'item_id',
            'associationForeignKey' => 'user_id',
            'order' => '',
            'limit' => '',
            'unique' => true,
            'finderQuery' => '',
            'deleteQuery' => '',
        )
    );

// Transaction.php association:

var $belongsTo = array('User', 'Item');

1 个答案:

答案 0 :(得分:3)

您正在寻找可包含的行为; e.g。

// app_model.php
var $actsAs = array(
    'Containable'
);

我假设User扩展了AppModel,因此将为子(User)设置Containable。现在,在你的控制器中,相关类的条件可以放在find()的第二个argv的'contains'键中; e.g。

// users_controller.php
$this->User->find('first', array(
    'conditions' => array('User.id' => $userId),
    'contain' => array(
        'Item' => array(
            'conditions' => array('Item.symbol' => $itemSymbol)
        )
    )
);

Cake会找到匹配的User并检索匹配的Items(使用相同的user_id和Item.Symbol指定。但是在不需要时要非常小心使用'contains'=> array(),否则Cake会检索所有已定义的关联,它们将对您的数据库征税。