【问题标题】:Kohana 3: getting related data from an ORM modelKohana 3:从 ORM 模型中获取相关数据
【发布时间】:2010-10-05 13:35:20
【问题描述】:

在使用 Kohana 3 的 ORM 模型时,从相关模型的字段中获取数据的最佳方式是什么?例如,我有一个员工,他有一家公司,有很多任务。我将如何从公司模型和分配模型(即 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
   )
}

【问题讨论】:

    标签: php orm kohana


    【解决方案1】:
    1. 对多个关系使用复数形式 (has_many)。公司有很多用户,用户有很多任务等。这并不重要,但值得推荐。
    2. users 表中公司的列名称是什么?似乎是company 而不是company_id。如果是这样,您可以重命名此外键或关系名称。

    【讨论】:

    • 啊,我看到了:Model_User 中的'foreign_key' => 'company'。您不能同时使用具有相同名称的外键和关系。
    【解决方案2】:

    为了得到你会做的公司

    $employee->company
    

    这样你就可以得到公司的属性了

    $employee->company->property
    

    为了得到你会做的任务

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

    您还可以在调用 find_all() 或 find() 之前链接其他查询方法,例如 ->where()。

    【讨论】:

    • 我试过了,但是 company 是公司的 ID,而不是公司本身。在构建员工模型以填充相关模型时,我需要做些什么吗?
    • @GSto,您可以将 Kohana 模型添加到您的帖子中吗?
    【解决方案3】:

    好吧,如果您的员工只能属于一家公司,那么访问该公司的方法如下:

    $company = $employee->company;
    

    然后您可以像访问任何其他模型一样访问$company 属性(字段)。

    我相信您可以访问的关系深度没有限制,所以这样做

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

    是可能的。记下您希望返回多条记录的 find_all();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多