Kohana (ORM) - как найти запись из 2 таблиц - PullRequest
0 голосов
/ 04 октября 2011
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 = 'любая из категорий из таблицы категорий'.Есть ли простой способ сделать это?

Ответы [ 3 ]

0 голосов
/ 05 октября 2011

Я нашел ответ.Это немного отличается, потому что я хотел найти фильм по названию категории (или по многим названиям категорий).Мне было легче найти фильм по его 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

зачем присоединяться() не объединяет целые таблицы без выбора ('*')?

0 голосов
/ 07 октября 2011

Если вы все еще хотите отфильтровать фильмы по названию категории, это должно сработать:

$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)
0 голосов
/ 04 октября 2011

То есть вы пытаетесь получить фильм по названию и категории?Я бы оставил 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();
...