在巴黎ORM创建查询

时间:2014-02-28 08:39:03

标签: sql database orm idiorm

我有一组食谱,每一个都包含类别。这是我的模特:

class Recipe extends \Model {
    public static $_table = "recipe";

    public function categories() {
        return $this->has_many_through('Category');
    }
}

class Category extends \Model {
    public static $_table = "category";

    public function categories() {
        return $this->has_many_through('Recipe');
    }
}

与两者相关的表格:

class CategoryRecipe extends \Model {
    public static $_table = "category_recipe";
}

现在我需要创建一个查询来获取一个/多个类别下的所有食谱。实现这个目标的方法是什么?我想避免做这样的事情:

$results = $app['paris']->getModel('CategoryRecipe')
                        ->where_in("category_id",$selected_categories)
                        ->find_many();

foreach($results as $result) {
    $recipe = $app['paris']->getModel('Recipe')
                           ->where('id',$result->recipe_id)
                           ->find_one();
    var_dump($receta->name);
}

创建过滤器?模特里面的功能?是不是可以让它更优雅?

1 个答案:

答案 0 :(得分:0)

这就是我要做的事情,但你可以用一种方式进行优化。将关系函数添加到链接/多对多表。然后,您只需执行以下操作,而不是在foreach循环中执行额外的查询:

foreach($results as $result) {
    $recipe = $result->recipe()->find_one();
    var_dump($recipe)
}

因此,您的CategoryRecipe模型可能如下所示:

class CategoryRecipe extends \Model {
    public static $_table = "category_recipe";

    public function recipe() {
        $this->belongs_to('Recipe', 'recipe_id');
    }

    public function category() {
        $this->belongs_to('Category', 'category_id');
    }
}

我还没有测试过这段代码,但它应该是我想到的。