MichaelMV
(Michmv)
September 10, 2009, 2:08pm
1
Помогите разобраться.
Есть две таблицы.
[sql]
CREATE TABLE User
(
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
username VARCHAR(128) NOT NULL,
password VARCHAR(128) NOT NULL,
email VARCHAR(128) NOT NULL,
create_time INTEGER,
update_time INTEGER,
hash VARCHAR(128),
status INTEGER DEFAULT 0,
role INTEGER DEFAULT 0,
remembe_pass INTEGER DEFAULT 0,
remembe_time INTEGER,
UNIQUE (
`username`,
`password`
)
);
CREATE TABLE Post
(
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
title VARCHAR(256) NOT NULL,
content TEXT,
content_display TEXT,
create_time INTEGER,
update_time INTEGER,
status INTEGER DEFAULT 0,
author_id INTEGER,
count_comment INTEGER
);
[/sql]
В модели Post:
public function relations()
{
return array(
'author'=>array(self::BELONGS_TO, 'User', 'author_id'),
);
}
Пишу в контроллере:
$criteria=new CDbCriteria;
$criteria->order = 'create_time DESC';
$criteria->condition='status = :status';
$criteria->params=array(':status'=>Post::STATUS_PUBLIC);
$posts=Post::model()->with(array('author'))->findAll($criteria);
Выдает ошибку:
CDbException
Description
CDbCommand failed to prepare the SQL statement: SQLSTATE[HY000]: General error: 1 ambiguous column name: status
Непойму в чем проблемма и как это лечится.
DARX
(Ioxanssen)
September 10, 2009, 2:25pm
2
Это означает, что в обеих таблицах есть поля с одинаковым именем (status), что и видно из дампа.
Странно, ведь Yii при join-е должен автоматом прописывать алиасы для полей.
Попробуйте together вместо with или же просто поменяйте имя поля status на что-нибудь другое в одной из таблиц.
UPD: $criteria->condition=‘Post.status = :status’; возможно поможет, но при этом потеряется доля гибкости.
MichaelMV
(Michmv)
September 10, 2009, 2:49pm
3
Это означает, что в обеих таблицах есть поля с одинаковым именем (status), что и видно из дампа.
Странно, ведь Yii при join-е должен автоматом прописывать алиасы для полей.
Попробуйте together вместо with или же просто поменяйте имя поля status на что-нибудь другое в одной из таблиц.
UPD: $criteria->condition=‘Post.status = :status’; возможно поможет, но при этом потеряется доля гибкости.
Что значит "[color="#008000 "]together вместо with[/color]"? В доках написано что надо применять вместе
$posts=Post::model()->with('author')->together()->findAll($criteria);
это тоже не работает или я ничего не понял.
2)"[color="#008000 "]$criteria->condition=‘Post.status = :status’;[/color]" действительно помогло, но вот в чем проблема - сразу ошибка на поле “create_time”, а затем наверное будет и “update_time”. Так что это не вариант.
3)"[color="#008000 "]просто поменяйте имя поля status на что-нибудь другое в одной из таблиц[/color]" думаю что это заработает, но тогда что, следить что бы во всей базе были уникальные имена у столбцов? Мне кажется должен быть более разумный выход.
Zolter
(Zolter Od)
September 10, 2009, 4:02pm
4
Просто в критерии перед именем используемой колонки поставить префикс модели с которой вы работаете. Т.е. вместо:
$criteria=new CDbCriteria;
$criteria->order = 'create_time DESC';
$criteria->condition='status = :status';
$criteria->params=array(':status'=>Post::STATUS_PUBLIC);
писать вот так:
$criteria=new CDbCriteria;
$criteria->order = 'Post.create_time DESC';
$criteria->condition='Post.status = :status';
$criteria->params=array(':status'=>Post::STATUS_PUBLIC);
ну это как вариант. хотя думаю должно быть что то типа принудительно ставить префиксы при формировании SQL. поковыряйте API, либо вручную расширьте функционал
MichaelMV
(Michmv)
September 10, 2009, 4:38pm
5
Да, помогло. Спасибо за помощь.
Насчет API, надо ковырять, если наковыряю напишу. Я только начал изучать Yii.