Список форумов Cake-PHP.ru Cake-PHP.ru
Форум программистов CakePHP
(на сайт)
 
 Watched TopicsWatched Topics   FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Ассоциации в модели

 
Начать новую тему   Ответить на тему    Список форумов Cake-PHP.ru -> Общий
Предыдущая тема :: Следующая тема  
Автор Сообщение
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    Заголовок сообщения: Ответить с цитатой

У меня появилась проблемка Sad
Есть две модели 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 писал(а):
По теме дерева

Не врубился как это юзать Confused
_________________
На работу в Новосибирске требуется 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', Laughing

должно быть foreignKey
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Имя
Сообщение

Смайлики
Very Happy Smile Sad Surprised
Shocked Confused Cool Laughing
Mad Razz Embarassed Crying or Very sad
Evil or Very Mad Twisted Evil Rolling Eyes Wink
Exclamation Question Idea Arrow
Дополнительные смайлики

 
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Cake-PHP.ru -> Общий Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы можете начинать темы
Вы можете отвечать на сообщения
Вы можете редактировать свои сообщения
Вы можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB

Рейтинг@Mail.ru