CakePHP 等的新手,我对以下问题非常困惑,因此非常感谢任何指导。本质上,我在 hasAndBelongsToMany 关系方面遇到了问题,而且我不知道我是否在正确处理它,因为我在一个 Controller 和一个模型中完成大部分工作。
我有一个客户的页面,客户有很多工作(这个有效),客户属于一个客户类型(这个有效),客户也有很多案例研究(也有效)并且客户有工作(很好)。
作业有并且属于许多学科——这不起作用,但是,它看起来好像正在运行查询( Debug模式下的 SQL 输出显示了这一点,所以我将 SQL 直接运行到 MySQL - 它查询正常) 但 Cake 没有向我提供客户数组中的数据。
这是我的客户端模型和 Controller 的代码。
Client.php(模型)
public $belongsTo = array(
'ClientType' => array(
'className' => 'ClientType',
'foreignKey' => 'type_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);
public $hasMany = array(
'CaseStudy' => array(
'className' => 'CaseStudy',
'foreignKey' => 'main_contractor',
'conditions' => '',
'fields' => '',
'order' => ''
),
'Job' => array(
'className' => 'Job',
'foreignKey' => 'client_id',
'conditions' => '',
'fields' => '',
'order' => 'Job.id desc'
)
);
ClientsController.php( Controller )
$options['joins'] = array(
array('table' => 'case_studies',
'alias' => 'CaseStudy',
'type' => 'LEFT',
'conditions' => array(
'CaseStudy.client_id = Client.id',
)
),
array('table' => 'jobs',
'alias' => 'Job',
'type' => 'LEFT',
'conditions' => array(
'Job.client_id = Client.id',
)
),
array('table' => 'sectors',
'alias' => 'Sector',
'type' => 'LEFT',
'conditions' => array(
'Job.sector_id = Sector.id',
)
),
array('table' => 'disciplines_jobs',
'alias' => 'DisciplinesJobs',
'type' => 'LEFT',
'conditions' => array(
'Job.id = DisciplinesJobs.job_id',
)
),
array(
'table' => 'disciplines',
'alias' => 'Discipline',
'type' => 'LEFT',
'conditions' => array(
'DisciplinesJobs.discipline_id = Discipline.id'
)
)
);
$options['conditions'] = array('Client.id' => $client_id);
$clients = $this->Client->find('all', $options);
上面 $clients 数组的输出:
array(
(int) 0 => array(
'Client' => array(
'id' => '47',
'type_id' => '2',
'name' => 'Balfour Beatty',
'logo' => '1361786198_thumbnail_balfour beatty.jpg',
'website_url' => 'http://www.google.com',
'date_added' => '2013-02-25 10:56:38',
'date_modified' => '2013-02-25 10:56:38'
),
'ClientType' => array(
'id' => '2',
'name' => 'Constructors'
),
'CaseStudy' => array(
(int) 0 => array(
'id' => '23',
'client_id' => '47',
'sector_id' => '1',
'name' => 'Shoreham Academy',
'header_image' => '1365088787_thumbnail_1365088787_header copy.jpg',
'main_contractor' => '47',
'architect' => 'Architecture PLB',
'project_value' => '565000',
'scope_of_works' => '<table></table>',
'text' => '<p><</p>',
'type' => 'flooring',
'date_added' => '2013-04-04 11:19:47',
'date_modified' => '2013-04-04 11:19:47'
)
),
'Job' => array(
(int) 0 => array(
'id' => '1',
'client_id' => '47',
'sector_id' => '2',
'project' => 'Shoreham Academy (Project not case study)',
'date' => '2012-10-19',
'cost' => '£416k',
'quantity_of_flooring' => '7000m',
'date_added' => '2013-08-06 21:46:59',
'date_modified' => '2013-08-06 21:47:01'
)
)
)
请注意上面的 $clients 数组没有来自 discipline_jobs 表的任何学科数据,但 SQL 输出成功运行:
SELECT `Client`.`id`, `Client`.`type_id`, `Client`.`name`, `Client`.`logo`, `Client`.`website_url`, `Client`.`date_added`, `Client`.`date_modified`, `ClientType`.`id`, `ClientType`.`name`
FROM `ar_flooring`.`clients` AS `Client`
LEFT JOIN `ar_flooring`.`case_studies` AS `CaseStudy` ON (`CaseStudy`.`client_id` = `Client`.`id`)
LEFT JOIN `ar_flooring`.`jobs` AS `Job` ON (`Job`.`client_id` = `Client`.`id`)
LEFT JOIN `ar_flooring`.`sectors` AS `Sector` ON (`Job`.`sector_id` = `Sector`.`id`)
LEFT JOIN `ar_flooring`.`disciplines_jobs` AS `DisciplinesJobs` ON (`Job`.`id` = `DisciplinesJobs`.`job_id`) LEFT JOIN `ar_flooring`.`disciplines` AS `Discipline` ON (`DisciplinesJobs`.`discipline_id` = `Discipline`.`id`)
LEFT JOIN `ar_flooring`.`client_types` AS `ClientType` ON (`Client`.`type_id` = `ClientType`.`id`)
WHERE `Client`.`id` = 47
我没有纪律模型或 Controller 。我没有工作模型或 Controller ,因为我正在尝试使用客户端模型和 Controller 来完成所有事情——这对吗?
有人知道为什么会这样吗?
希望这是有道理的。
干杯!
最佳答案
看来你想运行一个
$this->Client->find('all')
在您的 ClientsController 上。
在查找全部的过程中,您想要检索客户列表、每个客户所属的客户类型、每个客户拥有的案例研究列表、每个客户拥有的工作列表以及每个工作拥有和属于的学科。
首先,作为CakePHP的实践者,我几乎总是避免使用habtm关系。
原因是我几乎总是在连接表中有额外的字段。在这种情况下,jobs_disciplines
可能不仅仅是 job_id
和 discipline_id
。也许它还会有另一个名为 status
的字段。
我要做的是烘焙 JobsDiscipline 模型和 Discipline 模型。
JobsDiscipline 将同时属于 Discipline 和 Job。
Discipline 和 Job 都有很多 JobsDiscipline。
在此之后,要构建的查询基本上就是
$this->Client->find('all', array(
'contain' => array('ClientType', 'CaseStudy', 'Job' => array('JobsDiscipline'=>array('Discipline')))
));
即使您将 AppModel 的递归设置为 -1,这也应该有效。
如果这不起作用,请再次告诉我。
关于php - CakePHP - 多个 hasAndBelongsToMany 关系不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18165032/