【问题标题】:Filter results in has many relationship过滤结果有很多关系
【发布时间】:2019-03-08 14:15:51
【问题描述】:

我正在努力过滤一些结果。我有一个名为“Process”的表,另一个名为“Actors”。流程有很多演员。这是模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Process extends Model
{
    public function actors()
    {
        return $this->hasMany(Actor::class)->orderBy('actor');
    }
}

所以我有一个展示所有流程及其参与者的视图。问题是,我想做一个过滤选项,我会检查 Auth::user()->username 是否与 Actor->actor 相同。

我尝试了一些类似的东西:

public function index()
    {
        $processes = Process::all();

        $processes ->actors()->where('actor', 'Test')->get();

        return view('process.process', compact('processes '));

    }

(在我为测试目的与测试进行比较的地方,如果我确实让它工作,我显然会将其更改为 Auth::user()->username

这显示以下错误:

BadMethodCallException 方法 Illuminate\Database\Eloquent\Collection::actors 不存在。

我尝试了一些变体(例如,在控制器中运行一个 foreach,但要么我做错了,要么这不是这样做的方法......)但无济于事。非常感谢任何帮助!

【问题讨论】:

  • 你是否能够在没有任何地方和其他地方的情况下获得$processes-&gt;actors 的演员集合?
  • 是的,在我看来,我有一个这样的 foreach:“@foreach ($processes->actors as $actor)”,它工作得很好。
  • 那你可以试试$processes-&gt;actors-&gt;where('actor', 'Test') 告诉我你得到了什么吗?
  • 我做到了,而且有效。问题是,这样做所有进程仍然显示,只有在每个进程中我只显示称为“测试”的演员。我一直在寻找的是只显示其中有一个名为“测试”的参与者的进程。
  • $processes-&gt;actors()-&gt;get() 得到什么?

标签: php mysql laravel


【解决方案1】:

如果是的话,我假设你想要获取当前经过身份验证的用户的所有进程,这就是你所需要的。

public function index()
{
    $processes = Process::whereHas('actors',function($query){
                     $query->where('id',Auth::user()->id);
                  });

    return view('process.process', compact('processes '));

}

【讨论】:

  • 您如何指定这是当前 $process 或特定实例?
  • 他需要的是特定认证用户权限的所有过程吗? @PrafullaKumarSahu
  • 但是他正在使用$process 检索演员,并且该过程是特定的,我认为您没有指定。
  • 他正在使用的当前进程正在增加查询数量,因此我们不能将其用于性能目的@PrafullaKumarSahu
  • 干杯@JohnyJohnson
猜你喜欢
  • 2014-10-17
  • 2016-02-24
  • 1970-01-01
  • 2019-10-14
  • 2018-05-15
  • 2011-04-01
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
相关资源
最近更新 更多