У меня есть «сложная» модель, которая имеет множество единиц. Мои модельные ассоциации правильны, все работает, просто у меня возникают проблемы с правильной работой другой модели/ассоциации, и это заставило меня задаться вопросом, нужно ли мне устанавливать эту модель по-другому.CakePHP принадлежит принадлежит комплексу, но не все У Unit есть Complex?
Смотрите, а не ВСЕ Узел будет иметь связанный с ним комплекс. Некоторые единицы - это дома, некоторые единицы - гостиничные номера, а некоторые подразделения - только арендные компании.
Потому что у комплексов есть множество единиц. Я испытываю искушение оставить его в покое, но мне интересно, не следует ли переопределять отношения как Комплексные принадлежности к модулю. Я пытаюсь не повторять себя в своей базе данных с добавлением нескольких экземпляров одного и того же комплекса.
Вот мой текущий блок Модель:
class Unit extends AppModel {
public $name='Unit';
public $belongsTo=array(
'User'=>array(
'className'=>'User',
'foreignKey'=>'user'
),
'Complex'=>array(
'className'=>'Complex',
'foreignKey'=>'complex_id'
)
);
public $hasOne=array(
'Location'=>array(
'className'=>'Location',
'foreignKey'=>'location_id'
)
);
}
и вот мой текущий Комплексная модель:
class Complex extends AppModel {
public $name='Complex';
public $hasMany=array('Unit');
public $hasOne=array(
'Location'=>array(
'className'=>'Location',
'foreignKey'=>'location_id'
)
);
}
Кстати, «Location» является модель у меня возникли проблемы с (В настоящее время часть моего массива возвращает пустое место, когда я вызываю свою единицу/сложную информацию на мой взгляд, поэтому мне нужно получить право на мою ассоциацию).
Если устройство представляет собой жилой комплекс с комплексом, я хочу, чтобы он вернул местоположение комплекса. Если это дом или отель или компания по прокату, я хочу, чтобы она вернула местоположение подразделения. Я должен сделать несколько из этих ассоциаций (изображения, местоположение и т. Д.), Поэтому я хочу получить все прямо вверх.
Является ли мои текущие отношения между Unit и Complex правильными или мне нужно определить все по-другому?
UPDATE Вот мой контроллер логик:
$this->paginate['Unit']=array(
'limit'=>9,
'order' => 'RAND()',
'contain'=>array(
'User'=>array(
'email'),
'Complex'=>array(
'id','complex_name', 'realname', 'photo1','photo2','photo3','photo4','photo5'),
'Location'=>array(
'complex_id','address', 'city','state','zip','area_code','exchange','sln','lat','lon','website')
),
'conditions'=>array(
'Unit.type'=>array('condo', 'rentalco'),
'Unit.active'=>1)
);
$data = $this->paginate('Unit');
$this->set('allcondos', $data);
}
И вы можете увидеть результат я получаю here:
Я в настоящее время не заинтересован в отображении вида все комплексов, но индекс страница логика имеет ContainableBehavior, ограниченный просто комплексом (как изначально у меня были представления для разных Комплексов):
public function index() {
$this->Complex->Behaviors->attach('Containable');
$this->Complex->contain();
$c=$this->Complex->find('all');
$this->set('complexes', $c);
}
ОБНОВЛЕНИЕ У меня сейчас работает, для тех, кто сталкивается с этой проблемой. Мне пришлось изменить местоположение на корневой каталог и сделать Complex принадлежать местоположению. Вот мои модели обновлены:
class Location extends AppModel {
public $name='Location';
public $hasMany=array('Complex', 'Unit');
var $belongsTo=array(
'Restaurant'=>array (
'className'=>'Restaurant',
'foreignKey'=>'restaurant_id'
)
);
}
class Complex extends AppModel {
public $name='Complex';
public $hasMany=array('Unit');
public $hasOne=array('Image');
public $belongsTo=array(
'Location'=>array(
'className'=>'Location',
'foreignKey'=>'location_id'
)
);
}
class Unit extends AppModel {
public $name='Unit';
public $belongsTo=array(
'User'=>array(
'className'=>'User',
'foreignKey'=>'user'
),
'Complex'=>array(
'className'=>'Complex',
'foreignKey'=>'complex_id'
),
'Location'=>array (
'className'=>'Location',
'foreignKey'=>'location_id'
),
);
public $hasOne=array('Image');
}
Огромное спасибо Уайли за помощь, это был doozy!
Где в вашем приложении находится вызов 'find()', который оставляет «Местоположение» пустым? – Wylie
$ этом-> постраничной [ 'блок'] = массив ( \t \t \t 'предел' => 9, \t \t \t 'заказать' => 'RAND()', \t \t \t 'содержит' => массив ( \t \t \t \t \t 'User' => массив ( \t \t \t \t \t \t 'электронная почта'), \t \t \t \t'Комплекс' => массив ( \t \t \t \t \t \t 'ID', 'complex_name', 'RealName', 'фото1', 'фото2', 'фото3', 'photo4', 'фото5'), \t \t \t \t \t 'Location' => массив ( \t \t \t \t \t \t 'complex_id', 'адрес', 'город', 'состояние', 'молния', 'код_города', 'обмен', 'SLn', 'lat', 'lon', 'website') \t \t \t), \t \t \t 'условий' => массив ( \t \t \t \t \t 'Unit.type' => Array ('Кондо', 'rentalco'), \t \t \t \t \t 'Unit.active' => 1) \t \t \t); \t $ data = $ this-> paginate ('Unit'); \t $ this-> set ('allcondos', $ data); – huzzah
У всех этих моделей есть ContainableBehavior? Можете ли вы отредактировать OP и опубликовать результат поиска? – Wylie