CakePHP从HABTM关系中找到

时间:2014-07-02 19:48:53

标签: cakephp-2.0 cakephp-2.3

我有一张名为'公司'的桌子。我想加入这个表格'计划'。我写了以下模型关系。

Company: 
public $hasAndBelongsToMany = array(
       'Plan' => array(
            'className' => 'Plan',
            'joinTable' => 'companies_plans',
            'foreignKey' => 'company_id',
            'associationForeignKey' => 'plan_id',
            'unique' => 'keepExisting',
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'finderQuery' => '',
        )
    ); 
Plan: 
public $hasAndBelongsToMany = array(
        'Company' => array(
            'className' => 'Company',
            'joinTable' => 'companies_plans',
            'foreignKey' => 'plan_id',
            'associationForeignKey' => 'company_id',
            'unique' => 'keepExisting',
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'finderQuery' => '',
        )
    );
CompaniesPlan:
public $belongsTo = array(
        'Company' => array(
            'className' => 'Company',
            'foreignKey' => 'company_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'Plan' => array(
            'className' => 'Plan',
            'foreignKey' => 'plan_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );

现在我想从公司模型中找到加入...因为我已经写了以下代码......

    $companiesWithPlan = $this->find('all', array('joins' => array(
    array(
        'table' => 'companies_plans',
        'alias' => 'CompaniesPlan',
        'type' => 'inner',
        'foreignKey' => false,
        'conditions'=> array('CompaniesPlan.company_id = Company.id')
    ),
    array(
        'table' => 'plans',
        'alias' => 'Plan',
        'type' => 'inner',
        'foreignKey' => false,
        'conditions'=> array(
            'Plan.id = CompaniesPlan.Plan_id',
        )
    )
)));

然后我只得到公司表格数据..我不知道为什么它不起作用......

1 个答案:

答案 0 :(得分:1)

您定义$hasAndBelongsToMany等的最高位看起来不错。这是您最后的疑问。当您使用CakePHP的内置关联(hasAndBelongsToMany,belongsTo,hasMany等)时,Cake将负责为您提取关系。您不需要自己指定任何联接。您应该从这里一直到页面底部阅读doco:http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasandbelongstomany-habtm

(特别要注意,每次保存记录时都会删除并重新创建hasAndBelongsToMany个关联 - 确保“你想要的行为”

所以,我告诉过你不要使用连接 - 你使用的是Cake的containable behaviour,它允许你指定在查找时包含哪些关联。< / p>

正确的代码应如下所示:

$this->contain(['Company']);
$this->find('all');

您还需要确保在模型顶部包含可包含的行为:

public $actsAs = array('Containable');

我将可容纳在我的AppModel.php中,因为你所有的模特都应该使用它。

PS - 您使用联接的时间是指您的案例特别复杂且无法通过Cake的内置关联轻松处理 - hasMany,belongsTo等。大多数情况下,您不需要使用连接(当它看起来合适时,Cake会在幕后自动创建连接)。