#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.
Таким образом, ваш внешний ключ должен быть 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'
),
);
}