【问题标题】:get a values using many to many relations on laravel 5 models在 laravel 5 模型上使用多对多关系获取值
【发布时间】:2018-09-14 18:08:52
【问题描述】:

我真的是使用 laravel 5.0 的新手,所以当我尝试使用模型检索结果时遇到了这个问题。我有一个用户表,其中包含可以是经理或不是经理的用户列表,他们可以分配一个或多个公司,或者没有分配一个公司表,其中包含可以有一个或多个经理的公司,还有一个数据透视表,我称为公司经理。我在每个模型中都设置了这样的关系:

/***User model***/
public function companies()
{
    return $this->belongsToMany('App\Company', 'companies_managers','id', 'manager_id');
}

在公司模型中也是如此

public function managers()
{
    return $this->belongsToMany('App\User', 'companies_managers', 'id', 'company_id');
}

我想使用公司 ID 获取分配给公司的经理来获取它,但它只是给了我一个没有我要查找的值的巨大对象(分配给该公司的经理的姓名)。这是我尝试过的代码:

$managers = Company::find($id)->managers();

如果您能给我任何帮助,我将不胜感激

【问题讨论】:

    标签: php database laravel


    【解决方案1】:

    使用->managers()(带括号)实际上并没有返回关联的管理器,而是一个Builder 实例(“巨大的对象”),然后您可以在最后使用@ 检索它们之前将其与其他参数链接起来987654323@(或其他闭包,如->first()->paginate()等)

    使用->managers(不带括号)将尝试访问关联的管理器,并执行任何其他逻辑来检索它们。

    所以,你有两个选择:

    $company = Company::with(["managers"])->findOrFail($id);
    $managers = $company->managers;
    

    或者

    $company = Company::findOrFail($id);
    $managers = $company->managers()->get();
    

    这两者都将执行必要的逻辑来拉动管理器。 ->with() 并且没有括号稍微更有效,在一个查询中完成所有操作,所以请记住这一点。

    【讨论】:

      【解决方案2】:

      你只需要拆分你的代码;

      // this will find the company based on the id, or if it cannot find 
      // it will fail so will abort the application
      $company = Company::findOrFail($id); 
      
      
      // this uses the active company record and gets the managers based 
      // on the current company
      $managers = $company->managers;
      

      【讨论】:

        【解决方案3】:

        感谢你们的帮助,我解决了修复模型中的关系的问题:

                return $this->belongsToMany('App\Company', 'companies_managers', 'manager_id', 'company_id');
        

        还有这个

                return $this->belongsToMany('App\User', 'companies_managers', 'company_id', 'manager_id');
        

        我为 belongsToMany 函数设置的 ID 不正确

        还有这个

        $managers = Company::find($id)->managers();
        

        也是一个问题,是我的一个愚蠢的错误。我只使用 return 而不是 dd() 解决了 Builder 实例的返回,这样我就得到了我正在寻找的值。谢谢大家!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-12
          • 2016-09-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多