2015-01-15 3 views
0

я эта проблема с Containable, что у меня есть Категории модель, которая ведет себя как дерево:В CakePHP, как сделать Containable поведения сотрудничать с поведением дерева

class Category extends AppModel { 
    public $actsAs = ['Tree', 'Containable']; 

    public $hasMany = [ 
    'Novelty' => [ 
     'className' => 'Novelty', 
     'foreignKey' => 'category_id', 
     'dependent' => false, 
    ] 
    ] 
} 

его структура:

Category(
    id int(11) 
    name varchar(255) 
    parent_id int(11) 
    lft int(11) 
    rght int(11) 
) 

и у меня есть Новизна модель:

class Novelty extends AppModel { 
    public $actsAs = ['Containable']; 

    public $belongsTo = [ 
    'Category' => [ 
     'className' => 'Category', 
     'foreignKey' => 'category_id', 
    ] 
    ]; 
} 

Новизна структура:

Novelty(
    id int(11) 
    name varchar(255) 
    category_id int(11) 
) 

Ассоциации

Category -> hasMany -> Novlety 
Novelty -> belongsTo -> Category 

Категории Пример структуры из find('threaded') как это:

['Category'] => [ 
    'id' => 13 
    'name' => 'Main' 
    'lft' => 88 
    'rght' => 105 
    'children' => [ 
    [0] => [ 
     ['Category'] => [ 
     'id' => 131 
     'name' => 'sub1' 
     'lft' => 89 
     'rght' => 90 
     ] 
    ] 
    [1] => [ 
     ['Category'] => [ 
     'id' => 132 
     'name' => 'sub2' 
     'lft' => 91 
     'rght' => 92 
     ] 
    ] 
    [...] 
    ] 
] 

И теперь, когда я пытаюсь Containable:

$this->Category->contain(
    'Novelty' => [ 
    'conditions' => [ 
     'AND' => [ 
     'Novelty.category_id >=' => 13, 
     'Novelty.category_id !=' => 14 
     ] 
    ] 
    ] 
); 

Теперь, когда я бегу Category->find('all') там находятся нет новинок в результате. Потому что торт добавляет свое собственное состояние Novelty.category = (13). И я не могу избавиться и не расширять его. Таким образом, запрос выглядит так:

SELECT `Novelty`.`id`, `Novelty`.`name`, `Novelty`.`category_id`, 
FROM `databse`.`novelties` AS `Novelty` 
WHERE ((`Novelty`.`category_id` >= 13) 
    AND (`Novelty`.`category_id` < 14)) 
    AND `Novelty`.`category_id` = (13) 

Есть ли специальное условие, которое изменяет условие запроса по умолчанию?

Моя цель:

Чтобы получить новации, связанные с подкатегорию также, не только те, которые связаны с основной категории. Но возможно ли это?

ответ

2

Теперь, когда я запускаю Category-> find ('all'), в результате нет новинок. Потому что торт добавляет свое собственное состояние Novelty.category = (13). И I не может избавиться и не развернуть его. Таким образом, запрос выглядит так:

Это правильное поведение кода. У вас есть Cateogry hasMany Ассоциация новинок, чтобы это произошло. Торт добавляет условие.

Для меня это похоже, что вы хотите найти все записи новизны кроме те, для категории id 14, это правильно?

Временный unbindModel() вашей Новизна ассоциация и добавить его в качестве hasOne дца без внешнего ключа, но с условием:

['conditions' => ['Novelty.cateogry_id !=' 14]] 

Или использовать the joins array запрос.

+0

Я забыл упомянуть, что Категория - это Дерево. Поэтому я хочу получить всю новинку для категории = 13 и ее детей. У меня есть соглашение о том, что все дочерние категории имеют число начиная с 13. Бу теперь я вижу, что условие было бы неправильным, пока я не сделаю идентификатор для сортировки в лингвистическом порядке. Так или иначе.Я хочу получить все новинки для категории = 13 и его детей –

+0

«У меня есть соглашение о том, что все дочерние категории имеют число начиная с 13.» Это не похоже ни на один из поддерживаемых типов (родительский-родительский, вложенный набор) древовидных структур поведения. Однако для создания требуемых запросов используйте объединения, а не сдерживаемое поведение. – burzum

Смежные вопросы