如何在Laravel中过滤收藏?

时间:2014-04-25 19:06:34

标签: php laravel laravel-4

我有以下代码

$tecnico = Tecnico::with('servicios')->where('Auth_Token',$auth)->firstOrFail();
        if($tecnico != ''){
            $servicios = $tecnico->servicios;
            $servicio = $servicios->where('idServicio', $id);
        }  

Servicio有很多TecnicoTecnico有很多Service

在这种情况下,我只需要Tecnico中的Auth_token以后还需要Servicio中的所有Tecnico,但需要按id进行过滤上面代码出现以下错误

Symfony \ Component \ Debug \ Exception \ FatalErrorException
Call to undefined method Illuminate\Database\Eloquent\Collection::where()
$servicio = $servicios->where('idServicio', $id);

中的

我该如何解决?

2 个答案:

答案 0 :(得分:3)

你可以试试这个:

$tecnico = Tecnico::with(array('servicios' => function($q) use ($id) {
    $q->where('idServicio', $id);
}))->where('Auth_Token',$auth)->firstOrFail();

因此,您将获得其相关Tecnico等于Servicio->id的{​​{1}}模型,然后您可以使用$id获取第一个$tecnico->servicios->first()如果集合中有多个Servicio(很可能不会),那么您可以使用Servicio循环(基本上在foreach中)。您可以在view网站上查看有关this aka Eager Load Constraints的更多信息。

答案 1 :(得分:3)

回答你的问题是:

// if idServicio is set as primary key on Servicio model
$servicio = $tecnico->servicios->find($id); 


// in case idServicio was just a property and not necessarily unique do this:
// it return Collection of Servicio models matching $id
$servicio = $recnico->servicios->filter(function ($servicio) use ($id) {
   return $servicio->idServicio == $id;
}); 

无论如何,如果你真的只需要那个特定的Servicio,请使用像@WhereWolf建议的急切加载约束,而不是过滤集合。