Отношения Kohana и ORM has_many_through

У меня проблема с Kohana 3.3 и отношением ORM has_many_through. у меня две модели

Категория_модели

class Model_Category extends ORM {

    protected $_table_name = 'category';
    protected $_primary_key = 'category_id';
    protected $_has_many = array(
        'question' => array(
            'model' => 'Question',
            'through' => 'cat_question'
        ),
    );

}

Модель_Вопрос

class Model_Question extends ORM {

    protected $_table_name = 'question';
    protected $_primary_key = 'question_id';
    protected $_has_many = array(
        'category' => array(
            'model' => 'Category',
            'through' => 'cat_question'
        ),
    );

}
  • А в таблице cat_question есть два столбца, category_id, question_id,
  • в таблице question: question_id, title, content, date,
  • in category: category_id, name

Но это не очень хорошо работает .. Когда я делаю это так

$orm = ORM::factory('Question')->find_all();
foreach($orm as $el) {
    var_dump($el->category->name);
}

Они показывают мне NULL, но я не знаю, почему.


person vuz3    schedule 16.09.2013    source источник


Ответы (2)


Я справляюсь с этим, модель вопроса должна выглядеть так:

class Model_Question extends ORM {

    protected $_table_name = 'question';
    protected $_primary_key = 'question_id';

     protected $_has_many = array(
        'category' => array(
            'model' => 'Category',
            'through' => 'cat_question',
            'far_key' => 'category_id',
            'foreign_key' => 'question_id',
            ),
    );
  }

И модели категорий

class Model_Category extends ORM {

    protected $_table_name = 'category';
    protected $_primary_key = 'category_id';


    protected $_has_many = array(
        'question' => array(
            'model' => 'Question', 
            'far_key' => 'question_id',
            'through' => 'cat_question',
            'foreign_key' => 'category_id'
            ),
    );

}

И если мы хотим, чтобы была вся категория с количеством вопросов, сделайте что-то вроде этого:

  public function get_category_and_question() {
        $orm = ORM::factory('Category');
        $find = $orm->find_all();
        foreach ($find as $element) {
            $count = ORM::factory('Category', $element->category_id)->question->count_all();
            $new_array[] = array(
                'name' => $element->name,
                'id' => $element->category_id,
                'how_much' => $count
            );
        }
        return $new_array;
    }

Я не совсем уверен, что это действительно хорошее решение, но не плохо для меня.

person vuz3    schedule 17.09.2013

Проблема в том, что has_many_through означает «многие ко многим». Таким образом, одна категория содержит несколько вопросов и наоборот. Теперь, если бы вы следовали стандартам Kohana, ваше имя базы данных было бы categories, questions, categories_questions, и имя было бы во множественном числе, поэтому доступное через categories или questions.

Но вы этого не сделали, для работы ваш код должен выглядеть следующим образом

$orm = ORM::factory('Question')->find_all();
foreach($orm as $el)
{
    $categories = $el->category->find_all();
    foreach ($categories as $category)
    {
        var_dump($category->name);
    }
}
person kero    schedule 17.09.2013