|
Cake-PHP.ru Форум программистов CakePHP (на сайт)
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Xvakin
цитировать
Зарегистрирован: 12 Ноя 2007 16:22:17 Сообщения: 1
|
Добавлено: 12 Ноя 2007 16:37:11 Заголовок сообщения: Ассоциации в модели |
|
|
Извинте, если вопрос глупый и легко решается... Cake изучаю вторую неделю.
Так вот. Для примера делаю коллективный блог. Имеется модель Post, которая belongsTo User и Category, а также hasMany Comments. Каменты в свою очередь тоже belongsTo User и в модели каментов эта ассоциация работает. Как создать ее в модели Post - непонятно.
Для примера листинг модели Post:
Код: |
<?php
class Post extends AppModel {
var $name = 'Post';
var $belongsTo = array('Category' =>
array('className' => 'Category',
'conditions' => '',
'order' => '',
'dependent' => true,
'foreignKey' => 'category_id'
),
'User' =>
array('className' => 'User',
'conditions' => '',
'order' => '',
'dependent' => true,
'foreignKey' => 'user_id'
)
);
var $hasMany = array('Comments' =>
array('className' => 'Comment',
'conditions' => '',
'order' => '',
'limit' => '',
'foreignKey' => 'post_id',
'dependent' => true,
'exclusive' => false,
'finderQuery' => ''
)
);
}
?>
|
|
|
Вернуться к началу |
|
|
ztalker
цитировать
Зарегистрирован: 06 Ноя 2007 14:00:26 Сообщения: 26 Откуда: Новосибирск
|
Добавлено: 13 Ноя 2007 06:42:34 Заголовок сообщения: |
|
|
И что? Не работает в таком виде? В чем вопрос?
Вообще прописано верно. _________________ На работу в Новосибирске требуется PHP программист, со знанием CakePHP. Пишите в личку. |
|
Вернуться к началу |
|
|
ztalker
цитировать
Зарегистрирован: 06 Ноя 2007 14:00:26 Сообщения: 26 Откуда: Новосибирск
|
Добавлено: 14 Ноя 2007 08:04:15 Заголовок сообщения: |
|
|
У меня появилась проблемка
Есть две модели Dictionary (словарь) и DictionaryType (тип словаря).
Тип словаря может быть вложен в другой словарь полем parent_id, и в тип словаря вложены словари.
Т.е. ассоциации выглядят так:
Код: | public $belongsTo = array(
// тип словаря - "Родитель", куда вложен этот
'Parent' => array(
'className' => 'DictionaryType',
'conditions' => '',
'order' => '',
'foreignKey' => 'parent_id'),
);
public $hasMany = array(
// вложенные типы словарей
'Subs' => array(
'className' => 'DictionaryType',
'conditions' => '',
'order' => '',
'limit' => '',
'foreignKey' => 'parent_id',
'dependent' => false,
'exclusive' => false,
'finderQuery' => ''),
// вложенные словари
'Dictionary' => array(
'className' => 'Dictionary',
'conditions' => '',
'order' => '',
'limit' => '',
'foreignKey' => 'dictionary_type_id',
'dependent' => false,
'exclusive' => false,
'finderQuery' => '')
); |
Так вот, в версии 1.1 все работало и я методом findAll беру полный список типов и все вложения и родителей. В версии 1.2 - НЕ РАБОТАЕТ. Если в ассоциации $hasMany убрать одно из условий ('Subs' или 'Dictionary' без разницы), то работает, но тогда я уже теряю универсальность модели, и чтобы взять то, что выкинул из ассоциации мне нужно идти через "зад". И это во всех моделях! Если в $hasMany указано больше одной ассоциации, то cakephp просто виснет, даже если перед findAll указываю $this->Model->recursive = 0;.
Как исправить данную ситуацию, чтобы вышеуказанная ассоциация работала? _________________ На работу в Новосибирске требуется PHP программист, со знанием CakePHP. Пишите в личку. |
|
Вернуться к началу |
|
|
ztalker
цитировать
Зарегистрирован: 06 Ноя 2007 14:00:26 Сообщения: 26 Откуда: Новосибирск
|
Добавлено: 14 Ноя 2007 09:03:56 Заголовок сообщения: |
|
|
нарыл. но проблему не решил.
Вышеуказанное это описание ассоциаций в DictionaryType. В модели Dictionary следующие ассоциации:
Код: | public $belongsTo = array(
// тип словаря
'DictionaryType' => array(
'className' => 'DictionaryType',
'conditions' => '',
'order' => '',
'foreignKey' => 'dictionary_type_id'),
// словарь верхнего уровня - куда вложен этот
'Parent' => array(
'className' => 'Dictionary',
'conditions' => '',
'order' => '',
'foreignKey' => 'parent_id')
);
public $hasMany = array(
// словарь нижнего уровня, которые вложенны в этот
'Subs' => array(
'className' => 'Dictionary',
'conditions' => '',
'order' => '',
'limit' => '',
'foreignKey' => 'parent_id',
'dependent' => false,
'exclusive' => false,
'finderQuery' => '')
); |
Т.е. типы вложены друг в друга и словари вложены друг в друга, сделано это для организации следующего:
DictionaryType:
Код: | id | name | parent_id
1 | Страны | null
2 | Города | 1 |
т.е. тип словаря "города" вложен с "страны", чтобы при добавлении новых элементов сразу было ясно кому подчиняются словари.
Dictionary:
Код: | id | DictionaryType | name | parent_id
1 | 1 (Страны) | Россия | null
2 | 2 (Города) | Новосибирск | 1 (Россия)
3 | 1 (Страны) | USA | null
4 | 2 (Города) | NY | 3 (USA) |
т.е. "Новосибирск" это "Города" но вложен в словарь "Россия", а "Россия" это уже "Страны", аналогично "NY" в "USA".
Так вот если прописать все вышеперечисленные ассоциации (включая мое предыдущее сообщение), то в версии 1.1 все работает, а версии 1.2 cakephp виснет. Возникает вопрос - это косяк бэты 1.2 или просто надо идти другим путем? _________________ На работу в Новосибирске требуется PHP программист, со знанием CakePHP. Пишите в личку. |
|
Вернуться к началу |
|
|
KPOTOB Гость цитировать
|
Добавлено: 14 Ноя 2007 12:58:58 Заголовок сообщения: |
|
|
Виснет потому что у тебя дерево ассоциации до конца развернуть не может в Model::__construct - оно у тебя банально бесконечное
Аккурат вчера я в тоже гавно вступил.
Как понимаю кейк выстраивает полное дерево классов по ассоциациациям без учета $recursive а тупо пока все не развернет.
Не уверен только что это бага - скорее всего ассоциации не совем верно описаны(или построены). В данном случае - у тебя класс разворачиваеся вниз (по Subs) и вверх (по Parents) одновременно. B каждый из них также будет развернут вверх и вних - ясно что у тебя вечная рекурсия - вот php и грохается. |
|
Вернуться к началу |
|
|
KPOTOB Гость цитировать
|
Добавлено: 14 Ноя 2007 13:05:45 Заголовок сообщения: |
|
|
http://tempdocs.cakephp.org/#TOC95827 По теме дерева |
|
Вернуться к началу |
|
|
ztalker
цитировать
Зарегистрирован: 06 Ноя 2007 14:00:26 Сообщения: 26 Откуда: Новосибирск
|
Добавлено: 14 Ноя 2007 19:19:16 Заголовок сообщения: |
|
|
KPOTOB писал(а): | Не уверен только что это бага - скорее всего ассоциации не совем верно описаны(или построены). В данном случае - у тебя класс разворачиваеся вниз (по Subs) и вверх (по Parents) одновременно. B каждый из них также будет развернут вверх и вних - ясно что у тебя вечная рекурсия - вот php и грохается. |
Это понятно, что разворот идет вверх и вниз, но в 1.1 это работало! А теперь для 1.2 нужно либо переделывать (что очень не желательно), либо ждать исправления, если это баг конечно...
KPOTOB писал(а): | По теме дерева |
Не врубился как это юзать _________________ На работу в Новосибирске требуется PHP программист, со знанием CakePHP. Пишите в личку. |
|
Вернуться к началу |
|
|
KPOTOB
цитировать
Зарегистрирован: 09 Дек 2007 14:46:20 Сообщения: 127
|
Добавлено: 15 Дек 2007 16:15:08 Заголовок сообщения: |
|
|
https://trac.cakephp.org/ticket/3584 |
|
Вернуться к началу |
|
|
Гость
цитировать
|
Добавлено: 05 Мар 2008 06:17:38 Заголовок сообщения: |
|
|
У меня с ассоциацией возникает несколько иная проблема: в переведенном мануале написано, что foreignKey позволяет задать имя ключа не по правилам именования cake, но это как раз и не выходит.
Код: |
class Comment extends AppModel{
public $name = 'Comment';
public $belongsTo = array(
'User' => array( 'className' => 'User',
'foreignKey'=> 'user_id'),
'News' => array('className' => 'News',
'foreignKey'=> 'resource_id')
);
}
|
И в модели новостей:
Код: |
public $hasMany = array( 'Comment'=>array (
'className' => 'Comment',
'conditions' => 'Comment.model=0',
'order' => 'Comment.created DESC',
'foreign_key' => 'resource_id',
'depend' => true,
'exclusive' => false,
'findQuery' => ''
)
);
|
Т.е. я пытаюсь использовать FK Comment.recource_id для идентификации комментируемого ресурса в модели Comment.model. Но при выборке из контроллера новостей cake пытается использовать ключь Comment.news_id, которого нет. Как мне использовать свое имя ключа (cake 1.2b) ? |
|
Вернуться к началу |
|
|
cyberfox
цитировать
Зарегистрирован: 20 Янв 2008 14:50:10 Сообщения: 16
|
Добавлено: 05 Мар 2008 06:41:02 Заголовок сообщения: |
|
|
К предыдущему посту: решил проблему декомпозицией Comments на несколько моделей NewsComments и т.д. _________________ Мой сайт http://ring-0.ru |
|
Вернуться к началу |
|
|
KPOTOB
цитировать
Зарегистрирован: 09 Дек 2007 14:46:20 Сообщения: 127
|
Добавлено: 05 Мар 2008 11:25:57 Заголовок сообщения: |
|
|
'foreign_key' => 'resource_id',
должно быть foreignKey |
|
Вернуться к началу |
|
|
|
|
Вы можете начинать темы Вы можете отвечать на сообщения Вы можете редактировать свои сообщения Вы можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group Русская поддержка phpBB
|