Kohana 3: получение связанных данных из модели ORM - PullRequest
2 голосов
/ 05 октября 2010

При использовании моделей ORM Kohana 3, каков наилучший способ получения данных из полей связанных моделей? Например, у меня есть сотрудник, у которого есть одна компания и много назначений. Как мне получить данные из полей в модели компании и моделях назначения (т. Е. В отношениях has_one и has_many)?

РЕДАКТИРОВАТЬ: в соответствии с просьбой, вот эти модели.

Модель пользователя

class Model_User extends ORM {
    protected $_table_name = 'user';
    protected $_primary_key = 'id';
    protected $_primary_val = 'username';
    protected $_has_many = array(
        'task' => array(
            'model' => 'task',
            'foreign_key' => 'user',
        ),
    );
    protected $_belongs_to = array(
        'company' => array(
            'model' => 'company',
            'foreign_key' => 'company'
        ),
    );

Модель задачи

class Model_Task extends ORM {
    protected $_table_name = 'tasks';
    protected $_primary_key = 'id';
    protected $_primary_val = 'name';
    protected $_belongs_to = array(
        'project' => array(
            'model' => 'project',
            'foreign_key' => 'project'
        ),
        'user' => array(
            'model' => 'user',
            'foreign_key' => 'user'
        ),
    );

Фирменная модель

class Model_Company extends ORM {
    protected $_table_name = 'companies';
    protected $_primary_key = 'id';
    protected $_primary_val = 'name';
    protected $_has_many = array(
        'user' => array(
            'model' => 'user',
            'foreign_key' => 'company'
        ),
    );

}

Ошибка генерирования кода с контроллера

$users = ORM::factory('user')->find_all();
$list = array();
foreach($users as $user) {
   $list[$user->id] = array(
     'username' => $user->username,
     'email' => $user->email,
     'company' => $user->company->name  //error:Trying to get property of non-object
   )
}

Ответы [ 3 ]

2 голосов
/ 06 октября 2010
  1. Используйте множественные формы для множественных отношений (has_many).В компании много пользователей , у пользователя много задач и т. Д. Это не критично, но рекомендуется.
  2. Какое название столбца для компании в таблице users?Похоже, это company вместо company_id.Если это так, вы можете переименовать этот внешний ключ или имя отношения.
0 голосов
/ 06 октября 2010

Что ж, если ваш сотрудник может принадлежать только одной компании, то получить доступ к компании можно так:

$company = $employee->company;

Затем вы можете получить доступ к $company свойствам (полям), как и в любой другой модели.

Я считаю, что нет предела глубине отношений, к которым вы можете получить доступ, так что

$assignments $employee->company->assignments->find_all();

возможно. Запишите find_all();, где ожидается, что будет возвращено более одной записи.

0 голосов
/ 06 октября 2010

Чтобы получить компанию, вы должны сделать

$employee->company

Таким образом, вы можете получить свойства компании с

$employee->company->property

Чтобы получить назначения, вы должны сделать

$employee->company->assignments->find_all();

Вы также можете связать другие методы запроса, такие как -> where (), прежде чем вызывать find_all () или find ().

...