我有一张名为'公司'的桌子。我想加入这个表格'计划'。我写了以下模型关系。
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',
)
)
)));
然后我只得到公司表格数据..我不知道为什么它不起作用......
答案 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会在幕后自动创建连接)。