Подразделение CakePHP принадлежит к комплексу, но не все это имеет комплекс? - PullRequest
0 голосов
/ 30 января 2012

У меня есть «Сложная» модель, которая имеет много единиц.Мои ассоциации моделей правильные, все работает, просто у меня возникают проблемы с корректной работой другой модели / ассоциации, и это заставляет меня задуматься, нужно ли мне устанавливать эту модель по-другому.

Видите, не ВСЕПодразделение будет иметь комплекс, связанный с ним.Некоторые подразделения - это дома, некоторые - гостиничные номера, а некоторые - просто компании по аренде.

Поскольку у Комплексов есть много подразделений, я испытываю желание оставить это в покое, но мне интересно, не стоит ли переопределить отношения какКомплексная принадлежность к блоку.Я пытаюсь не повторяться в своей базе данных с добавлением в несколько экземпляров одного и того же комплекса.

Вот моя текущая модель объекта:

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' - это модель, с которой у меня возникают проблемы (часть Location моего массива в настоящее время возвращается пустой, когда я вызываю свою единицу / сложную информацию в моем представлении, поэтому мне нужнопоймите правильно мою ассоциацию).
Если это кондоминиум с комплексом, я хочу, чтобы он возвращал Местоположение комплекса.Если это дом, гостиница или компания по прокату, я хочу, чтобы он вернул местонахождение объекта.Мне нужно сделать несколько таких ассоциаций (изображения, местоположение и т. Д.), Поэтому я хочу сразу все выяснить.

Верны ли мои нынешние отношения между модулем и комплексом или мне нужно все определитьиначе?

ОБНОВЛЕНИЕ Вот логика моего контроллера:

$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);


}

И вы можете увидеть результат, который я получаю здесь:

В настоящее время я не заинтересован в отображении представления всех Комплексов, но логика страницы индекса имеет ContainableBehavior, ограниченный просто Complex (как изначально я собирался иметь представления для различных Комплексов):

 public function index() {
    $this->Complex->Behaviors->attach('Containable');
    $this->Complex->contain();
    $c=$this->Complex->find('all');
    $this->set('complexes', $c);
    }

ОБНОВЛЕНИЕ У меня это работает сейчас, для всех, кто сталкивается с этой проблемой.Мне пришлось изменить местоположение в корне и сделать комплекс принадлежать к местоположению.Вот мои обновленные модели:

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

}

Большое спасибо Уайли за помощь, это было офигительно!

1 Ответ

1 голос
/ 31 января 2012

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'); Вам не нужно использовать Contain, когда вы этого не хотите.это не должно мешать.

Когда модель A имеет модель B, вы используете внешний ключ в модели B. Поэтому ваш внешний ключ в Location должен быть complex_id.Хотя это не должно быть так, потому что не все юниты имеют комплекс.

Мне кажется, вы должны сделать Location "корнем".Таким образом, комплекс принадлежит местоположению, а объект принадлежит комплексу и местоположению.Затем Location имеетOne / Many complex и т. Д. Или это, или просто поместите адресные столбцы в таблицы Unit / Complex.

...