Проблема отношений «многие ко многим» в модели CakePHP

#cakephp #cakephp-2.1 #cakephp-2.3 #cakephp-model

#cakephp #cakephp-2.1 #cakephp-2.3 #cakephp-модель

Вопрос:

У меня возникают проблемы с получением всех данных из отношений. Вот мои таблицы:

 **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');
 

И получите массив всех регионов, который будет иметь подмассив областей, в котором будет подмассив карДилеров.

Мой код возвращает только массив регионов и областей, но не 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(
    );
}
 

Я что-то упускаю в отношениях моих моделей?

спасибо, Джейсон

Комментарии:

1. Пожалуйста book.cakephp.org/2.0/en/models/model-attributes.html#recursive Для рекурсивного $this->Region-> recursive = 5; там только -1, 0, 1, 2.

2. Вам нужно проверить соглашения об именах cake, которые вы говорите public $belongsTo = array('Areas' => array('className' => 'Areas', , когда ясно, что ваше имя класса Region , и множество других крошечных важных деталей, таких как that.book.cakephp.org/2.0/en/getting-started /…

3. Ошибка последнего комментария … «когда очевидно, что ваше имя класса <strike>Region</strike> Area » (но это Region тоже происходит)

4. Спасибо Nunser, это была проблема. Я думал, что массив должен указывать на фактическое имя таблицы (которое является множественным числом в моей схеме). Я переключил его на фактическое имя класса, и это сработало. Если вы опубликуете это в качестве ответа, я дам вам за это баллы.

5. четан явно приложил усилия к своему ответу, и он решает все проблемы с вашим кодом. Примите это. Возможно, в следующий раз я добавлю полный ответ 🙂

Ответ №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');
 

Необходимо изменить className отношения модели

Это должно быть «Область», «Регион», «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'
    ),
);
 }
 

Модель CarDealer:

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

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