вывод данных из связянных таблиц

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
will123
Сообщения: 30
Зарегистрирован: 2010.04.09, 21:27
Откуда: Иркутск

вывод данных из связянных таблиц

Сообщение will123 »

Есть у меня модели Post, Comment, User, Profile.
модель Post:

Код: Выделить всё

    public function relations()
    {
        return array(
            'author' => array(self::BELONGS_TO, 'User', 'author_id'),
            'comments'=>array(self::HAS_MANY, 'Comment', 'post_id'),
        );
    } 
модель Comment:

Код: Выделить всё

    public function relations()
    {
        return array(
            'post'=>array(self::BELONGS_TO, 'Post', 'post_id'),
            'author'=>array(self::BELONGS_TO, 'User', 'author_id'),
        );
    } 
модель User:

Код: Выделить всё

    public function relations()
    {
        return array(
            'post' => array(self::HAS_MANY, 'Post', 'author_id'),
            'comments'=>array(self::HAS_MANY, 'Comment', 'author_id'),
            'profile' => array(self::BELONGS_TO, 'Profile', 'id'),
        );
    } 
модель Profile:

Код: Выделить всё

    public function relations()
    {
        return array(
            'user' => array(self::BELONGS_TO, 'User', 'user_id'),
        );
    } 
когда вывожу пост и его комментарии, нужно так же вывести автора комментария и аватар автора который хранится в profile.
Начинаю с выборки поста

Код: Выделить всё

$criteria->with = array('author'); //пробую писать comments.author.profile не работает, и без with тоже
$post=Post::model()->findByPk($_GET['id'], $criteria); 
затем в отображении

Код: Выделить всё

foreach($post->comments as $comment) :
    $comment->author->username //как и нужно, имя пользователя выводит
    $comment->author->profile->avatar //не работает такая конструкция      
так вот как мне можно достучаться до профиля при выводе комментов?
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: вывод данных из связянных таблиц

Сообщение timlar »

У Вас аватар хранится в таблице Profile, а в отношении author у Вас указана таблица Users. Обращение идет к другой таблице.
Twitter: @timlar_ua
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: вывод данных из связянных таблиц

Сообщение slavcodev »

Timlar писал(а):У Вас аватар хранится в таблице Profile, а в отношении author у Вас указана таблица Users. Обращение идет к другой таблице.
Ну так author это модель User, в которой profile связь с моделью Profile, где аватарка.
Можешь и ошибку засветить? и схему таблицы user и profile.
Жду Yii 3!
Аватара пользователя
will123
Сообщения: 30
Зарегистрирован: 2010.04.09, 21:27
Откуда: Иркутск

Re: вывод данных из связянных таблиц

Сообщение will123 »

таблица профиль:

Код: Выделить всё

CREATE TABLE IF NOT EXISTS `profile` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `avatar` varchar(255) NOT NULL,
  `additional` text,
  `interests` text,
  PRIMARY KEY (`id`)
) 
таблица юзер:

Код: Выделить всё

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL,
  `password` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL,
  `role` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) 
ошибку не выдает, просто ничего не выводит
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: вывод данных из связянных таблиц

Сообщение timlar »

mc-bear писал(а):
Timlar писал(а):У Вас аватар хранится в таблице Profile, а в отношении author у Вас указана таблица Users. Обращение идет к другой таблице.
Ну так author это модель User, в которой profile связь с моделью Profile, где аватарка.
Можешь и ошибку засветить? и схему таблицы user и profile.
Тогда, как я понимаю, должно быть:

Код: Выделить всё

'author' => array(self::BELONGS_TO, 'Profile', '', 'on'=>'profile.user_id=users.id'), 
И тогда можно будет использовать:

Код: Выделить всё

$comment->author->profile->avatar
Twitter: @timlar_ua
Аватара пользователя
will123
Сообщения: 30
Зарегистрирован: 2010.04.09, 21:27
Откуда: Иркутск

Re: вывод данных из связянных таблиц

Сообщение will123 »

нет, так не работает.. мне ведь нужно еще и имя юзера узнать, а оно находится в таблице юзер
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: вывод данных из связянных таблиц

Сообщение timlar »

Ну по идее так... В модели Posts:

Код: Выделить всё

        public function relations()
        {
            return array(
                'author' => array(self::BELONGS_TO, 'User', 'author_id', 'with'=>'profile'),
                ...
            );
        }  
В модели Users:

Код: Выделить всё

    public function relations()
    {
        return array(
            'profile' => array(self::BELONGS_TO, 'Profile', '', 'on'=>'profile.user_id=users.id'),
            ...
        );
    }  
Попробуйте этот вариант. А вообще, посмотрите дамп модели, что там вообще находится.
Twitter: @timlar_ua
Аватара пользователя
will123
Сообщения: 30
Зарегистрирован: 2010.04.09, 21:27
Откуда: Иркутск

Re: вывод данных из связянных таблиц

Сообщение will123 »

ругается что

Код: Выделить всё

CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'user.id' in 'on clause' 
на условие, где profile.user_id=user.id
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: вывод данных из связянных таблиц

Сообщение timlar »

users, а не user.
Twitter: @timlar_ua
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: вывод данных из связянных таблиц

Сообщение slavcodev »

Код: Выделить всё

    public function relations()
    {
        return array(
            'profile' => array(self::BELONGS_TO, 'Profile', '', 'on'=>'profile.user_id=t.id'),
            ...
        );
    }  
Жду Yii 3!
Аватара пользователя
will123
Сообщения: 30
Зарегистрирован: 2010.04.09, 21:27
Откуда: Иркутск

Re: вывод данных из связянных таблиц

Сообщение will123 »

разницы нет, ругается и на users, хотя как я понял users это таблица? если да то таблица у меня user
Аватара пользователя
will123
Сообщения: 30
Зарегистрирован: 2010.04.09, 21:27
Откуда: Иркутск

Re: вывод данных из связянных таблиц

Сообщение will123 »

и еще, почему мы прописываем эту связь в модели Post, а не Comment? мне кажется будет лучше и правильнее это прописать в модели комментариев..
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: вывод данных из связянных таблиц

Сообщение timlar »

mc-bear писал(а):

Код: Выделить всё

    public function relations()
    {
        return array(
            'profile' => array(self::BELONGS_TO, 'Profile', '', 'on'=>'profile.user_id=t.id'),
            ...
        );
    }  
Вариант :) Я как-то и не подумал про дефолтный алиас :oops:
Twitter: @timlar_ua
Аватара пользователя
will123
Сообщения: 30
Зарегистрирован: 2010.04.09, 21:27
Откуда: Иркутск

Re: вывод данных из связянных таблиц

Сообщение will123 »

ругается на t.id,

Код: Выделить всё

CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[42S22]: Column not found: 1054 Unknown column 't.id' in 'on clause' 
а почему в модели Post мы прописываем

Код: Выделить всё

'author' => array(self::BELONGS_TO, 'User', 'author_id', 'with'=>'profile'), 
? Получается что я вывожу комментарии comments->author->profile->avatar, причем тут модель Пост? или я может чего то не понимаю...
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: вывод данных из связянных таблиц

Сообщение timlar »

will123 писал(а):Получается что я вывожу комментарии comments->author->profile->avatar, причем тут модель Пост? или я может чего то не понимаю...
Потому, что исходя из Вашего первого поста, выборка делается в модели Posts:

Код: Выделить всё

    $criteria->with = array('author'); //пробую писать comments.author.profile не работает, и без with тоже
    $post=Post::model()->findByPk($_GET['id'], $criteria);  
Twitter: @timlar_ua
Аватара пользователя
will123
Сообщения: 30
Зарегистрирован: 2010.04.09, 21:27
Откуда: Иркутск

Re: вывод данных из связянных таблиц

Сообщение will123 »

хмм.. при таком раскладе я не доберусь никак до профайла из коммента... может лучше отдельно выборку делать, выбрать пост а потом по его id отдельно комменты?
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: вывод данных из связянных таблиц

Сообщение timlar »

Еще как доберетесь :) Посмотрите внимательно дамп полученной модели.

Можете попробовать сделать отдельную выборку. Тяжело что-то советовать вслепую.
Twitter: @timlar_ua
Аватара пользователя
will123
Сообщения: 30
Зарегистрирован: 2010.04.09, 21:27
Откуда: Иркутск

Re: вывод данных из связянных таблиц

Сообщение will123 »

пробую отдельно тянуть комменты:
модель Comment:

Код: Выделить всё

    public function relations()
    {
        return array(
            'post'=>array(self::BELONGS_TO, 'Post', 'post_id'),
            'author' => array(self::BELONGS_TO, 'User', 'author_id', 'with'=>'profile'),
        );
    } 
модель User:

Код: Выделить всё

    public function relations()
    {
        return array(
            'post' => array(self::HAS_MANY, 'Post', 'author_id'),
            'comments'=>array(self::HAS_MANY, 'Comment', 'author_id'),
            'profile' => array(self::BELONGS_TO, 'Profile', 'id'),
          //  'profile' => array(self::BELONGS_TO, 'Profile', '', 'on'=>'profile.user_id=t.id'), //так тоже пробывал
        );
    } 
модель Profile:

Код: Выделить всё

    public function relations()
    {
        return array(
            'user' => array(self::BELONGS_TO, 'User', 'user_id'),
        );
    } 
вытягиваю так:

Код: Выделить всё

$commentList = Comment::model()->with('author')->findAll('post_id=:postId', array(':postId'=>$post->id)); 
вывожу так:

Код: Выделить всё

<?php echo $comment->author->profile->avatar //avatar точно есть, так же пробую и id и др. поля?>
но ничего не выводит, а вот $comment->username норм.
дамп как я понял, это лог запросов? тогда вот он, вроде там тоже все норм:

Код: Выделить всё

system.db.CDbCommand.query(SELECT `t`.`id` AS `t0_c0`, `t`.`post_date` AS `t0_c1`, `t`.`author_id` AS `t0_c2`, `t`.`content` 
AS `t0_c3`, `t`.`post_id` AS `t0_c4`, `author`.`id` AS `t1_c0`, `author`.`username` 
AS `t1_c1`, `author`.`password` AS `t1_c2`, `author`.`email` AS `t1_c3`, `author`.`role` 
AS `t1_c4`, `profile`.`id` AS `t2_c0`, `profile`.`user_id` AS `t2_c1`, `profile`.`avatar` 
AS `t2_c2`, `profile`.`additional` AS `t2_c3`, `profile`.`interests` AS `t2_c4` 
FROM `comment` `t` LEFT OUTER JOIN `user` `author` ON (`t`.`author_id`=`author`.`id`) 
LEFT OUTER JOIN `profile` `profile` ON (`author`.`id`=`profile`.`id`) WHERE (post_id=:postId)) 
Аватара пользователя
will123
Сообщения: 30
Зарегистрирован: 2010.04.09, 21:27
Откуда: Иркутск

Re: вывод данных из связянных таблиц

Сообщение will123 »

может сталкивался кто нибудь с такой проблемой?
Аватара пользователя
will123
Сообщения: 30
Зарегистрирован: 2010.04.09, 21:27
Откуда: Иркутск

Re: вывод данных из связянных таблиц

Сообщение will123 »

нашел ошибку)), чтобы задать связь 1 к 1, нужно было не

Код: Выделить всё

'profile' => array(self::BELONGS_TO, 'Profile', 'user_id'), 
а

Код: Выделить всё

'profile' => array(self::HAS_ONE, 'Profile', 'user_id'), 
ну а в модели профайл

Код: Выделить всё

'user' => array(self::BELONGS_TO, 'User', 'user_id'), 
Ответить