【问题标题】:Which relationship type to choose in Laravel Eloquent ORM on multiple relationships case在 Laravel Eloquent ORM 中在多个关系案例中选择哪种关系类型
【发布时间】:2014-05-16 08:04:43
【问题描述】:

我是 Laravel 的新手,对 ORM 的一些定义有点困惑。 我目前正在开发一个简单的故障单管理系统,这是我的问题: (表:列,列,...) 门票 : id, description, equipment_id 设备:id、名称、vendor_id 供应商:id,名称

这是我的表及其关系的简短简历,遵循 Laravel 的约定。如何构建这些模型?

基本上我需要检索,例如,向某个供应商打开了多少票(我致电供应商寻求支持的次数)。

提前谢谢你

【问题讨论】:

    标签: orm laravel eloquent table-relationships


    【解决方案1】:

    zwacky 所说的完全(编辑:最终可能不完全正确)对于密切关系是正确的,但在您的情况下存在嵌套关系:

    Vendor -> Equipment -> Ticket
    

    然后要检索特定供应商的票证,您将在 Vendor 模型上定义关系,如下所示:

    class Vendor extends Eloquent {
      public function equipment()
      {
        return $this->hasMany('Equipment');
      }
      public function tickets()
      {
        return $this->hasManyThrough('Ticket', 'Equipment');
      }
    
    
    class Equipment extends Eloquent {
      public function tickets()
      {
        return $this->hasMany('Ticket');
      }
      public function vendor()
      {
        return $this->belongsTo('Vendor');
      } 
    
    
    class Ticket extends Eloquent {
      public function equipment()
      {
        return $this->belongsTo('Equipment');
      }
    

    并获取供应商的总票数(目前未开放):

    Vendor::find($id)   // retrieve particular vendor
      ->tickets()->count(); // get count on tickets table
    
    // and this way you retrieve collection of related tickets
    Vendor::find($id)   // retrieve particular vendor
      ->tickets; // get Eloquent Collection
    

    您可能会觉得它有帮助:http://softonsofa.com/querying-relations-with-eloquent-in-laravel-4/

    【讨论】:

    • 感谢您的清理。我收到了错误 Trying to get property of non-object... 我应该在其他类(设备和票证)中建立任何反比关系吗?
    • 检查已编辑的答案,现在您已经拥有了使其工作的所有关系。
    • 完美!完美运行。
    • 评论:您将方法写为public class 而不是public function。非常感谢!
    【解决方案2】:

    您需要在其模型中声明这些关系。例如您的 Ticket.php 模型可能如下所示:

    class Ticket extends Eloquent {
    
        public function equipment()
        {
            return $this->hasOne('Equipment');
        }
    
        public function vendor()
        {
            return $this->hasOne('Vendor');
        }
    
        ...
    }
    

    对于检索,您可以这样做:

    foreach (Ticket::all() as $ticket) {
        $ticket->vendor()->id;
    }
    

    查看laravel docs的这一部分。

    编辑:对于特定查询有多少票对某个供应商开放

    Ticket::where('open', '=', 1)->vendor()->where('id', '=', 42);
    

    【讨论】:

      猜你喜欢
      • 2020-11-08
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      • 2014-05-10
      • 2013-04-03
      • 2015-10-29
      • 2015-01-21
      • 1970-01-01
      相关资源
      最近更新 更多