2012-01-30 1 views
0

У меня есть «сложная» модель, которая имеет множество единиц. Мои модельные ассоциации правильны, все работает, просто у меня возникают проблемы с правильной работой другой модели/ассоциации, и это заставило меня задаться вопросом, нужно ли мне устанавливать эту модель по-другому.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!

+0

Где в вашем приложении находится вызов 'find()', который оставляет «Местоположение» пустым? – Wylie

+0

$ этом-> постраничной [ 'блок'] = массив ( \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

+0

У всех этих моделей есть ContainableBehavior? Можете ли вы отредактировать OP и опубликовать результат поиска? – Wylie

ответ

1

http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html?containing-deeper-associations#containing-deeper-associations

When using ‘fields’ and ‘contain’ options - be careful to include all foreign keys that your query directly or indirectly requires. Please also note that because Containable must to be attached to all models used in containment, you may consider attaching it to your AppModel.

Вы можете сделать это в вашем AppModel, как это: public $actsAs = array('Containable'); Вы не должны использовать Содержат, когда вы не хотите, чтобы он не должен мешать ,

Если модель A имеет модель B, вы используете внешний ключ в модели B. Таким образом, ваш внешний ключ в местоположении должен быть complex_id. Хотя, это не должно быть так, потому что не все подразделения имеют сложный характер.

Мне кажется, что вы должны указать расположение «корень». Таким образом, Complex принадлежит местоположению и подразделению, принадлежащему комплексу и местоположению. Затем Location hasOne/Many complex и т. Д. Либо это, либо просто поместить столбцы адресов в таблицы Unit/Complex.

+0

Хорошо, после изменения моей ассоциации и обманывания, я получил ее на работу, отправляю то, что я сделал в OP. Спасибо за помощь! – huzzah