代码之家  ›  专栏  ›  技术社区  ›  Myer

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

  •  2
  • Myer  · 技术社区  · 14 年前

    我的架构具有以下关系:

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

    我想退货 属于 . 我可以通过

    $this->User->find('all', array( 'conditions' => 
        array( 'User.id' => $userId ) ) )
    

    我可以用

    $this->Item->find( 'all', array( 'conditions =>
        array( 'Item.symbol' => $itemSymbol ) );
    

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

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

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

    相关信息: //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关联

    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关联:

    var $belongsTo = array('User', 'Item');
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   Wayne    14 年前

    你在寻找可控制的行为;例如。

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

    我假设用户扩展了AppModel,所以将为子(用户)设置Containable。现在,在控制器中,相关类的条件可以放在find()的第二个argv的“contain”键中;例如。

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

    Cake将找到匹配的用户并检索匹配的项(具有相同的用户id和指定的项.Symbol)。但在不需要时,请非常小心地使用“contain”=>array(),否则Cake将检索所有已定义的关联,这将占用您的数据库。