簡體   English   中英

Yii Active Record-關系表上的WHERE

[英]Yii Active Record - WHERE on relations-table

我的mysql數據庫中有以下表格:

category (id,name, url)
recipe_categories (category_id, recipe_id)
recipes (id, name, description)

我要實現的SQL語句如下所示:

SELECT * FROM recipes r 
INNER JOIN recipe_categories cr ON cr.recipe_id = r.id
INNER JOIN category c ON c.id = cr.category_id
WHERE c.url = "google.de"

兩種模式:

<?php
class RecipeCategoryModel extends CActiveRecord
{
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    public function tableName()
    {
        return 'recipe_categories';
    }


    public function relations()
    {
        return array(
            'recipes'   => array(self::MANY_MANY ,      'RecipeModel',      'recipe_has_categories(recipe_category_id,recipe_id)'),
        );
    }

    public function getActive() {
        return RecipeCategoryModel::model()->with(array(
            'recipes'=>array(
                'joinType'=>'INNER JOIN',
            ),
        ))->findAll();
    }
}

?>


<?php
class RecipeModel extends CActiveRecord
{
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    public function tableName()
    {
        return 'recipes';
    }

    public function relations()
    {
        return array(
            'categories'    => array(self::MANY_MANY ,      'RecipeCategoryModel',      'recipe_has_categories(recipe_id,recipe_category_id)'),
        );
    }

    public function getMainImage() {

    }

}

?>

問題出在哪里。 如何通過ActiveRecord(with(),CDbCriteria,...)實現這一目標?

在考慮答案時,我不得不稍微清理一下數據庫表和模型名稱,因為所提供的代碼在測試時會導致一些錯誤。 但是我已經能夠生成所需的SQL語句-但是請記住,在使用Yii的ActiveRecord時,它使用了自己的語法和表別名。

我得到的結果是:

SELECT `t`.`id` AS `t0_c0`, `t`.`name` AS `t0_c1`, `t`.`description` AS `t0_c2`, `categories`.`id` AS `t1_c0`, `categories`.`name` AS `t1_c1`, `categories`.`url` AS `t1_c2`
FROM `recipe` `t` 
INNER JOIN `recipe2category` `categories_categories` ON (`t`.`id`=`categories_categories`.`recipe_id`) 
INNER JOIN `category` `categories` ON (`categories`.`id`=`categories_categories`.`category_id`) 
WHERE (categories.url = 'google.de')

要在Yii CActiveRecord調用中獲取WHERE語句,您需要在CDbCriteria或FindAll()參數中添加“條件”或“比較”。 參見http://www.yiiframework.com/doc/api/1.1/CDbCriteria#condition-detailhttp://www.yiiframework.com/doc/api/1.1/CDbCriteria#addCondition-detail

例如:

$Criteria = new CDbCriteria;
$Criteria->with = array(
'categories' => array(
    'joinType' => 'INNER JOIN'
    ),
);
$Criteria->condition = 'categories.url = :url';
$Criteria->params = array(
    ':url' => 'google.de',
);

$Recipes = Recipe::model()->findAll($Criteria);

但是,要使該代碼起作用,您將需要我清理過的數據庫表和模型:

TABLE recipe - id, name, description
TABLE recipe2category - category_id, recipe_id
TABLE category - id, name, url

模型Recipe.php:

<?php
class Recipe extends CActiveRecord
{
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    public function tableName()
    {
        return 'recipe';
    }

    public function relations()
    {
        return array(
            'categories'    => array(self::MANY_MANY , 'RecipeCategory', 'recipe2category(recipe_id,category_id)'),
        );
    }
}

?>

模型RecipeCategory.php:

<?php
class RecipeCategory extends CActiveRecord
{
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    public function tableName()
    {
        return 'category';
    }

    public function relations()
    {
        return array(
        'recipes'   => array(self::MANY_MANY , 'Recipe', 'recipe2categoy(category_id,recipe_id)'),
        );
    }
}

?>

希望這是有用的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM