2010-10-05 3 views
2

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

РЕДАКТИРОВАТЬ: в соответствии с запросом, приведены модели, о которых идет речь.

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

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 
    ) 
} 

ответ

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

А, я вижу: 'foreign_key' => 'company' в Model_User. Вы не можете использовать как внешний ключ, так и отношения с теми же именами. – biakaveron

0

Чтобы получить компанию вы бы

$employee->company 

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

$employee->company->property 

Чтобы получить задание вы бы do

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

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

+0

Я пробовал это, но компания была идентификатором компании, а не самой компании. Есть ли что-то, что мне нужно сделать при построении модели сотрудника, чтобы получить соответствующие модели для заполнения? – GSto

+0

@GSto, можете ли вы добавить свои модели Kohana на свой пост? –

+0

@ Pixel Developer, код добавлен – GSto

0

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

$company = $employee->company; 

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

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

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

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

Смежные вопросы