【问题标题】:Cakephp HABTM with multiple joins needed需要多个连接的 Cakephp HABTM
【发布时间】:2014-09-25 18:35:18
【问题描述】:

我对 Cakephp 很陌生。我的所有模型协会都工作正常,但这个让我很难过,我还没有找到解决类似问题的人。来了。。

我有 4 张桌子:

+-----+-------+ |身份证 |名字 | +-----+-------+ | 1 |吉姆 | | 2 |鲍勃 | +--------------+

facility_project_people

+-----+----------+------------+ |身份证 |设施项目ID |人名 | +-----+----------+------------+ | 1 | 5 | 1 | | 2 | 6 | 1 | | 3 | 7 | 2 | +---------------+------------+

facility_projects

+-----+-------------+------------+------------+ |身份证 |设施_id |项目ID| type_id | +-----+-------------+------------+------------+ | 1 | 1 | 1 | 1 | | 2 | 2 | 3 | 2 | | 3 | 2 | 5 | 3 | +-------------------+------------+-----------+

项目

+-----+--------------+ |身份证 |姓名 | +-----+--------------+ | 1 |审计 | | 2 |库存 | | 3 |税务 | | 4 |咨询 | +-------------------+

所以我有人可以参与每个设施的许多项目
我正在尝试建立一个模型关联,以从 Person 到他们参与的项目。

MySQL 查询类似于:
SELECT p.first_name, pr.name FROM people p left join facility_project_people fpp ON p.id = fpp.person_id left join facility_projects fp ON fpp.facility_project_id = fp.id left join projects pr ON fp.project_id = pr.id

使用 hasAndBelongsToMany 关联,我了解如何到达 facility_projects 表。

class Person extends AppModel {
    public $hasAndBelongsToMany = array(
    PersonFacilityProject' => array(
            'className' => 'Project',
            'joinTable' => 'facility_project_people',
            'foreignKey' => 'person_id',
            'associationForeignKey' => 'facility_project_id',
        ),
    }
} 

显然这并没有给我我需要的东西

查看一个人时,我想查看相关项目,但不知道如何访问项目表。我希望能够向关联添加另一个连接表和外键,但 cakephp 似乎不允许这样做。

感谢任何见解。

【问题讨论】:

  • 您是如何尝试检索数据的,您的尝试结果如何?
  • facility_projects 表应该是它自己的模型(参见hasMany through)。该新模型 belongsTo 项目(以及 belongsTo Facility 和 belongsTo 类型)。然后你就可以拥有已经与你的项目相关的 Person HABTM facilty_projects。

标签: php mysql cakephp


【解决方案1】:

您没有说明您使用的 cakephp 版本。但是,您可以使用“包含”来执行此操作(因为您的模型并非都直接相关),如下所示:

    $conditions = [
        'contain' => [
            'FacilityProjectPerson'=>[
                'FacilityProject'=>[
                    'Project'=>[
                        'fields'=>['Project.name']
                    ],
                ],
            ], 
        ],
    //  'conditions' => [//just in case you need conditions for selecting people
    //      'Person.id' => $this->id, 
    //  ],
        'fields'=>['Person.first_name']
    ];

    $this->Person->find('all',$conditions);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-19
    • 2013-08-07
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多