Реляционная Active Record

Помогите разобраться.

Есть две таблицы.

[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

Непойму в чем проблемма <_< и как это лечится.

Это означает, что в обеих таблицах есть поля с одинаковым именем (status), что и видно из дампа.

Странно, ведь Yii при join-е должен автоматом прописывать алиасы для полей.

Попробуйте together вместо with или же просто поменяйте имя поля status на что-нибудь другое в одной из таблиц.

UPD: $criteria->condition=‘Post.status = :status’; возможно поможет, но при этом потеряется доля гибкости.

  1. Что значит "[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]" думаю что это заработает, но тогда что, следить что бы во всей базе были уникальные имена у столбцов? ??? Мне кажется должен быть более разумный выход.

Просто в критерии перед именем используемой колонки поставить префикс модели с которой вы работаете. Т.е. вместо:


$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, либо вручную расширьте функционал

Да, помогло. Спасибо за помощь.

Насчет API, надо ковырять, если наковыряю напишу. Я только начал изучать Yii.