2013-08-26 3 views
2

У меня есть две таблицы: product и document и оба находятся в отношениях с document_id.Как написать сложный запрос JOIN в CDbCriteria Yii Framework

Теперь я хочу получить имя документа product_id из базы данных, используя Yii CDbCriteria.

Как:

SELECT d.* 
FROM `document` As d, `product_document` AS p 
WHERE d.document_id=p.document_id 
AND 
p.product_id=133; 

Я хочу написать тот же запрос, но с использованием CDbCriteria. Я пробовал это, но я зацикливаюсь на его синтаксисе.

ответ

5

Гарри имеет право синтаксиса. Если вы хотите, чтобы сделать его более экологически чистые и повторно используемым во всем приложении, следует использовать именованный масштаб:

/* scope in your Document model */ 
public function forProductId($id) { 
    $criteria = new CDbCriteria(); 
    $criteria->condition = 'product.id = :productId', 
    $criteria->with = 'product'; 
    $criteria->params = array(
     ':productId' => (int)$id, 
    ); 
    return $this->dbCriteria()->mergeWith($criteria); 
} 

Делает вашу установку более многоразового с течением времени ...

+1

+1 за хорошее использованием случае [параметризованная именованная область] (http://www.yiiframework.com/doc/guide/1.1/en/database.ar#named-scopes). Для полноты: @Glenn, вы должны поместить этот метод в свою модель «Документ» и затем использовать его как '$ documents = Document :: model() -> forProductId ($ id) -> findAll()'. –

+0

@ MichaelHärtl Спасибо. Я работаю над проектом, в котором я все время сталкиваюсь с этим типом кода, я работаю над тем, чтобы побудить моих коллег сделать смену, это бесценно ;-) – acorncom

+0

@acorncom: Это сработало ... Спасибо за помощь – Sky

2

Вот ваши критерии, при условии, что у вас есть отношения установлены правильно:

$c = Document::model()->getDbCriteria(); 
$c->with[] = 'product'; 
$c->addCondition('product.product_id = :product_id'); 
$c->params[':product_id'] = 133; 
Смежные вопросы