kohana ORM foreign_key

Я пытаюсь найти способ получить данные из разных связанных таблиц в Кохане.

У меня есть таблица файлов, которая определяется как:

class Model_File extends ORM {

    protected $_belongs_to = array
    (
    'student' => array ('foreign_key' => 'student_id' )
    );
}

Затем таблица сеанса:

class Model_Filesession extends ORM {

    protected $_primary_key = 'id';
    protected $_table_name = 'file_sessions';  


    protected $_belongs_to = array
    (
    'file'       => array ('modele'=> 'file'       , 'foreign_key' => 'file_id'     ),
    'subject'    => array ('modele'=> 'subject'    , 'foreign_key' => 'subject_id'  ),
    'place'      => array ('modele'=> 'place'      , 'foreign_key' => 'place_id'    ),
    'teacher'    => array ('modele'=> 'teacher'    , 'foreign_key' => 'teacher_id'  )
    );

}

Таким образом, нет прямой связи между файловой сессией и студентом ... Поэтому я не могу добавить ее в соединение с файловой сессией (-> with ('student'))

В настоящее время я делаю это:

        $fileSessions  =   ORM::factory('filesession')
        ->with('subject')
        ->with('teacher')
        ->with('place')
        ->with('file')
        ->where('payment_id','=',$payment_id)
        ->order_by('sessionDate','DESC')
        ->find_all();

Как я могу изменить этот запрос на JOIN в таблице учеников?

Другими словами ... мне просто нужно добавить следующее:

INNER JOIN students ON students.id = file.student_id

Но с помощью Kohana ORM

Изменить (добавлена ​​модель ученика)

class Model_Student extends ORM {

    protected $_has_one = array(
    'file' => array(
    'model'       => 'file',
    'foreign_key' => 'student_id',
    ),
    );

     protected $_belongs_to = array
    (
    'level' => array ('foreign_key' => 'level_id' )
    );

}

person Tarek    schedule 25.12.2012    source источник
comment
kohanaframework.org/3.3/guide-api/ORM#join?   -  person biakaveron    schedule 26.12.2012
comment
Это может помочь: stackoverflow.com/questions/3286539/   -  person dzeno    schedule 26.12.2012


Ответы (1)


Вы можете использовать join и on так же, как в построителе запросов к БД.

    $fileSessions  =   ORM::factory('filesession')
    ->with('subject')
    ->with('teacher')
    ->with('place')
    ->with('file')
    ->join(array('students','student'))->on('student.id', '=', 'file.student_id')
    ->where('payment_id','=',$payment_id) 
    ->order_by('sessionDate','DESC')
    ->find_all();

или вы можете использовать свойство $_load_with в файловой модели. Он выполняет загрузку автоматически за вас, поэтому вам не понадобится второй вызов.

class Model_File extends ORM {

  protected $_belongs_to = array
  (
  'student' => array ('foreign_key' => 'student_id' )
  );
  protected $_load_with = array('student');
}

Когда вы загружаете модель File, вы можете получить к ней доступ, используя $file->student автоматически, и, например, на вашем Filesession это будет $filesession->file->student

person pocesar    schedule 28.12.2012
comment
Я подумал, что можно изменить определение модели, чтобы оно работало. - person Tarek; 28.12.2012
comment
обновите свой пост определением модели вашего ученика, и я могу вам помочь. Мне нужно убедиться, используете ли вы соглашения об именах модуля ORM или нет - person pocesar; 29.12.2012
comment
Я могу загрузить ученика из файла, проблема возникает, когда я пытаюсь загрузить ученика с помощью FileSessions - person Tarek; 29.12.2012