【问题标题】:Many-to-many relationships issue in CakePHP modelCakePHP 模型中的多对多关系问题
【发布时间】:2024-04-29 18:05:02
【问题描述】:

我在从关系中获取所有数据时遇到问题。这是我的表格:

**Regions**    
id(pk)
regions_name

**Areas**    
id(pk)
areas_name
regions_id (fk)

**carDealer**    
id(pk)
dealer_name
areas_id(fk)

我认为通过这种设计,我应该能够像这样查询区域:

    $this->Region->recursive = 5;
    $getRegions = $this->Region->find('all');

然后得到一个包含所有 Regions 的数组,其中包含一个 Areas 子数组,该数组包含一个 carDealers 子数组。

我的代码只带回 Regions 和 Areas 数组,但不带回 carDealers。这是我的模型的一些相关代码:

区域表

<?php
App::uses('AppModel', 'Model');    
class Region extends AppModel {    
    public $validate = array(    
    );

    public $belongsTo = array(    
    );
    public $hasMany = array(
        'Areas' => array(
            'className' => 'Areas',
            'foreignKey' => 'regions_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),   
    );
}

面积表:

<?php
App::uses('AppModel', 'Model');
class Area extends AppModel {
    public $validate = array(
    );    
    public $belongsTo = array(
        'Regions' => array(
            'className' => 'Regions',
            'foreignKey' => 'regions_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
    );
    public $hasMany = array(
        'carDealer' => array(
            'className' => 'carDealer',
            'foreignKey' => 'areas_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
    );
}

汽车经销商表:

<?php
App::uses('AppModel', 'Model');

class carDealer extends AppModel {
    public $validate = array(
    );

    public $belongsTo = array(
        'Areas' => array(
            'className' => 'Areas',
            'foreignKey' => 'areas_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
    );
    public $hasMany = array(
    );
}

我是否在我的模特关系中遗漏了什么?

谢谢 杰森

【问题讨论】:

  • book.cakephp.org/2.0/en/models/model-attributes.html#recursive递归 $this->Region->recursive = 5;只有 -1、0、1、2 存在。
  • 您需要检查蛋糕命名约定,当您的 className 显然是 Region 时,您会说 public $belongsTo = array('Areas' =&gt; array('className' =&gt; 'Areas',,以及许多其他类似的微小重要细节。book.cakephp.org/2.0/en/getting-started/…
  • Last comment failed...“当你的 className 明显是 Region Area”(但 Region 也会发生这种情况)
  • 谢谢 Nunser,这就是问题所在。我认为该数组应该指向实际的表名(在我的模式中是复数)。我将它切换为实际的类名并且有效。如果您将此作为回复发布,我会给您积分。
  • chetan 显然在他的答案上付出了努力,它解决了您的代码的所有问题。接受。也许下次我会添加一个完整的答案:)

标签: cakephp cakephp-2.1 cakephp-2.3 cakephp-model


【解决方案1】:

hasMany、belongsTo 或 hasOne 关系中的外键默认被识别为相关表的(单数)名称,后跟 _id。

通过http://book.cakephp.org/2.0/en/getting-started/cakephp-conventions.html#model-and-database-conventions

所以你的外键应该是 area_id , region_id

需要更改递归级别

 $this->Region->recursive = 1;
 $getRegions = $this->Region->find('all');

需要修改Model关系的className

应该是'Area'、'Region'、'CarDealer'。

需要删除不必要的变量或数组选项

区域模型

<?php
 App::uses('AppModel', 'Model');    
class Region extends AppModel {    
   public $hasMany = array(
    'Area' => array(
        'className' => 'Area',
        'foreignKey' => 'region_id'
       ),   
);
}

区域模型:

<?php
  App::uses('AppModel', 'Model');
 class Area extends AppModel {

public $belongsTo = array(
    'Region' => array(
        'className' => 'Region',
        'foreignKey' => 'region_id'
    ),
);
public $hasMany = array(
    'CarDealer' => array(
        'className' => 'CarDealer',
        'foreignKey' => 'area_id'
    ),
);
 }

汽车经销商型号:

<?php
 App::uses('AppModel', 'Model');

class CarDealer extends AppModel {
   public $belongsTo = array(
    'Area' => array(
        'className' => 'Area',
        'foreignKey' => 'area_id'
       ),
);
  }

【讨论】: