YII вопрос
Поскажите плз, что я не правильно делаю
имеются две таблицы (не нужные поля вырезаны)

CREATE TABLE IF NOT EXISTS `hotel_number` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
)

CREATE TABLE IF NOT EXISTS `number_photo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`number_id` int(11) NOT NULL,
`photo` text,
PRIMARY KEY (`id`)
)

и, соответственно, две модели
Number и NumberPhoto

В модели NumberPhoto описана связь вот таким образом
public function relations()
{
return array(
‘number’ => array(self::BELONGS_TO, ‘Number’, ‘number_id’),
);
}
и все работает корректно ( например $model->number->name )

В модели Number
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
‘number_photos’=>array(self::HAS_MANY, ‘Number’, ‘number_id’),
);
}
при попытке обратится к $number->number_photos;
получаю вот такую ошибку
CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘number_photos.number_id’ in ‘where clause’. The SQL statement executed was: SELECT `number_photos`.`id` AS `t1_c0`, `number_photos`.`rooms` AS `t1_c1`, `number_photos`.`descriptiom` AS `t1_c2`, `number_photos`.`count` AS `t1_c3`, `number_photos`.`price` AS `t1_c4`, `number_photos`.`name` AS `t1_c5` FROM `hotel_number` `number_photos` WHERE (`number_photos`.`number_id`=:ypl0)

ЧТО я делаю не так ии как с этим бороться?

25 Responses to Вопрос по MySQL

  1. IjaZero:

    Вероятно, что надо так:
    $numbers = Number::model()->with(‘number_photos’)->findAll();
    Потому что ленивая загрузка.

  2. HneZZ:

    al-qaji: ну погоди, а связывание на уровне моделей?

  3. MsdGood:

    Я правильно понимаю, что ты пытаешься из таблицы hotel_number вытащить number_id, которого там и нет?

  4. HneZZ:

    нет, я из объекта number пытаюсь вытянуть связанные с ним объекты number_photo

  5. Hproff:

    self::HAS_MANY, ‘NumberPhoto

  6. IjaZero:

    Связи по BELONGS_TO он подтягивает сразу, т.к. всё идёт одним запросом (поэтому первый случай работает), а HAS_MANY он подтягивает только если указано, потому что каждое отношение достаётся отдельным запросом, а они далеко не всегда все нужны. Оптимизация в общем. И это как бы не совсем ленивая загрузка, тут попутал чутка.

  7. Ikiam:

    CREATE TABLE IF NOT EXISTS `number_photo` (

    SELECT `number_photos`.`id` AS `t1_c0`, `number_photos`.`rooms` AS `t1_c1`, `number_photos`.`descriptiom` AS `t1_c2`, `number_photos`.`count` AS `t1_c3`, `number_photos`.`price` AS `t1_c4`, `number_photos`.`name` AS `t1_c5` FROM `hotel_number` `number_photos` WHERE (`number_photos`.`number_id`=:ypl0)

  8. Ikiam:

    короче таблицу переименуй, например

  9. HneZZ:

    у меня таблица и модель по разному называются.

  10. HneZZ:

    al-qaji: ага, понял. А как вытаить не все связанное, а только фото, связанные с конкретным номером?

  11. HneZZ:

    упс, понял, ща

  12. HneZZ:

    не, тоже самое
    CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘number_photo.number_id’ in ‘where clause’. The SQL statement executed was: SELECT `number_photo`.`id` AS `t1_c0`, `number_photo`.`rooms` AS `t1_c1`, `number_photo`.`descriptiom` AS `t1_c2`, `number_photo`.`count` AS `t1_c3`, `number_photo`.`price` AS `t1_c4`, `number_photo`.`name` AS `t1_c5` FROM `hotel_number` `number_photo` WHERE (`number_photo`.`number_id`=:ypl0)

  13. MsdGood:

    … FROM `hotel_number` `number_photos` WHERE … == «вытащить данные из таблицы hotel_number, обозвав её в запросе для удобства как number_photos»

  14. HneZZ:

    посмотри внимательно
    он делает select из двух таблиц

  15. MsdGood:

    Где тут две таблицы в запросе?

  16. HneZZ:

    FROM `hotel_number` `number_photos`

  17. MsdGood:

    Ещё раз — «вытащить данные из таблицы hotel_number, обозвав её для удобства number_photos»


    tbl_name [[AS] alias]

    Слово «AS» является необязательным и, как в данном случае, может быть опущено.

  18. HneZZ:

    во бля. понял, спс

  19. HneZZ:

    Хорошо, а как правильно расписать эту свзяь?

  20. MsdGood:

    http://yiiframework.ru/doc/guide/ru/data…?
    Если правильно понял твою структуру, то User-array(self::HAS_MANY, ‘Number’, ‘number_id’)
    );

    как и указал

  21. IjaZero:

    таблицы

    CREATE TABLE IF NOT EXISTS `hotel_number` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(50) NOT NULL,
    PRIMARY KEY (`id`)
    )

    CREATE TABLE IF NOT EXISTS `number_photo` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `number_id` int(11) NOT NULL,
    `photo` text,
    PRIMARY KEY (`id`),
    FOREIGN KEY (`number_id`) REFERENCES `hotel_number`(`id`)
    )

    В моделях:
    // HotelNumber
    public function relations() {
    return array(
    ‘photos’ => array(self::HAS_MANY, ‘NumberPhotos’, ‘number_id’);
    );
    }

    // NumberPhotos
    public function relations() {
    return array(
    ‘hotel’ => array(self::BELONGS_TO, ‘HotelNumber’, ‘number_id’);
    );
    }

    в контроллере грузим данные номера со всеми его фотографиями:
    $number = HotelNumber::model()->with(‘photos’)->findByPk($id);

  22. 01pSpb:

    ох уж этот ваш пидорский AR

  23. Kkebad:

    выше правильно написали, для связи в разных моделях и названия моделей разными должны быть, то есть первая должна ссылаться на вторую, а вторая на первую

    плюс если у тебя хитрый кондишен и кофликтуют имена столбцов, юзай t. как префикс для поля. t. в данном случае означает основную таблицу

  24. XibZZ:

    Какой нахуй number, блеать? Room.

  25. HneZZ:

    у них там room обозначает другое
    уебанская система, не я придумал

Добавить комментарий