2010-10-05 20 views
2

Lors de l'utilisation des modèles ORM de Kohana 3, quel est le meilleur moyen d'obtenir des données à partir de champs de modèles associés? Par exemple, j'ai un employé, qui a une compagnie, et a beaucoup de devoirs. Comment procéder pour obtenir des données à partir des champs du modèle d'entreprise et du (des) modèle (s) d'affectation (c.-à-d. Dans une relation has_one et has_many)?Kohana 3: obtention de données associées à partir d'un modèle ORM

EDIT: comme demandé, voici les modèles en question.

Modèle utilisateur

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' 
     ), 
    ); 

Modèle Tâche

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' 
     ), 
    ); 

Modèle Société

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' 
     ), 
    ); 

} 

code erreur Lancer, à partir du contrôleur

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

Répondre

2
  1. Utilisez des formes plurielles pour les relations multiples (has_many). La société a beaucoup utilisateurs, l'utilisateur a beaucoup tâches etc. Son pas critique mais recommandé.
  2. Quel est le nom de colonne de la société dans la table users? On dirait que c'est un company au lieu de company_id. Si c'est le cas, vous pouvez renommer cette clé étrangère ou ce nom de relation.
+1

Ah, je le vois: 'foreign_key' => 'company' dans Model_User. Vous ne pouvez pas utiliser à la fois la clé étrangère et la relation avec les mêmes noms. – biakaveron

0

Pour l'entreprise que vous feriez

$employee->company 

Vous pouvez obtenir les propriétés de l'entreprise avec

$employee->company->property 

Pour les missions que vous le feriez faire

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

Vous pouvez également chaîner d'autres méthodes de requête telles que -> where() avant d'appeler find_all() ou find().

+0

J'ai essayé ceci, mais la compagnie était l'identification de l'entreprise, pas la compagnie elle-même. Y a-t-il quelque chose que je dois faire lors de la construction du modèle d'employé pour obtenir les modèles liés à peupler? – GSto

+0

@GSto, pouvez-vous ajouter vos modèles Kohana à votre message? –

+0

@The Pixel Developer, le code a été ajouté – GSto

0

Eh bien, si votre employé ne peut appartenir à une entreprise puis d'accéder à l'entreprise serait fait comme ceci:

$company = $employee->company; 

Vous pouvez alors accéder $company propriétés (champs) comme vous le feriez avec tout autre modèle.

Je crois qu'il n'y a aucune limite à la profondeur des relations que vous pouvez accéder, faire

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

est possible. Prenez note du find_all(); où vous vous attendez à avoir plus d'un enregistrement retourné.