class Model_Category extends ORM
{
protected $_has_many = array(
'film' => array('through' => 'films_categories')
);
}
class Model_Film extends ORM
{
protected $_has_many = array(
'categories' => array(
'through' => 'films_categories'
),
}
films
-id (pk)
-title
-description
categories
-id (pk)
-name
films_categories
-film_id
-category_id
这就是我的表格外观,这是我需要做的事情:
$films->ORM::factory('film');
$films
->where('title', '=', $my_title)
->and_where('any of categories name', '=', $category_name)
->find_all();
我需要找到具有$ my_category ='类别表中的任何类别'的记录。有什么简单的方法吗?
答案 0 :(得分:0)
所以你想通过它的标题和类别来拍电影? 我将单独留下ORM用于此查询,因为您不会从查询构建器中获益更多:
$films = DB::select()
->from('films')
->where('title', '=', $my_title)
->and_where($category_name, 'IN', DB::select()->from('categories')->execute()->as_array('id', 'name'))
->execute();
答案 1 :(得分:0)
我找到了答案。它有点不同,因为我想通过其类别名称(或许多类别名称)找到电影。我发现通过category_id更容易找到电影。如果有人在这里发现它有用,那就是:
$category_id = 13;
$films = ORM::factory('film')
->select('category_id')
->join('films_categories')
->on('films_categories.film_id', '=', 'film.id')
->where('category_id', '=', $category_id)
->find_all();
foreach($films as $f)
echo $f->title . " " . $f->category_id . "<br/>";
我不知道它究竟是如何工作的,但事实确实如此。我偶然发明了这个。 如果有人能告诉我为什么需要这一行:
->select('category_id')
或
->select('*')
没有这一行,它给出了错误:
Kohana_Exception [ 0 ]: The category_id property does not exist in the Model_Film class
为什么join()不连接整个表而没有select('*')?
答案 2 :(得分:0)
如果您仍希望按类别名称过滤掉影片,则应该有效:
$films = ORM::factory('film')
->join('films_categories')->on('films_categories.film_id', '=', 'film.id')
->join(array('categories', 'category'))->on('category.id', '=', 'films_categories.category_id')
->where('film.title', '=', $film_title)
->where('category.name', '=', $category_name)
->find_all();
我想你需要
->select('category_id')
在您的查询中,因为您没有在where语句中指定列表。像这样:
->where('films_categories.category_id', '=', $category_id)