在Laravel 4.x中,我有一个客户Eloqeunt模型,它与Customer_tel Eloquent模型有关系:
class Customer extends Eloquent
{
public function tel()
{
return $this->hasMany('Customer_tel');
}
}
Customer_tel表有一个布尔列' main'。
当我在视图中创建Customer Class的实例时,我可以使用filter()
方法过滤掉主编号:
$Customer = Customer::find(1);
$Customer->tel->filter(function($tel)
{
if ($tel->main == true)
{
return true;
}
})->shift()->tel
但是当我尝试使用filter()
方法在类中创建一个函数时:
public function mainTel()
{
return $this->tel()->filter(function($tel)
{
if ($tel->main == true)
{
return true;
}
})->shift()->tel;
}
当我尝试在视图$Customer->mainTel
中引用它时,它会给我一个错误"Call to undefined method Illuminate\Database\Query\Builder::filter()"
。
为什么我不能仅在课外但不在课程中过滤实例?有没有正确的方法呢?
答案 0 :(得分:0)
调用方法(tel()
)将返回HasMany
实例,然后您可以在其上调用查询构建器方法。使用Eloquent的魔法属性,您可以将其短路。因此$customer->tel
相当于$customer->tel()->get()
,它返回一个集合。这就是为什么它在你的第一个例子中为你工作的原因。
有关详细信息,请参阅the docs。
更好的选择是在查询本身中执行此操作:
return $this->tel()->where('main', true)->pluck('tel');
另请注意Eloquent中的you can create your own magic properties:
class Customer extends Eloquent {
public function tel()
{
return $this->hasMany('Customer_tel');
}
public function getMainTelAttribute()
{
return $this->tel()->where('main', true)->pluck('tel');
}
}
现在有了$customer
模型,你可以直接调用你的魔法:
$tel = $customer::find(1)->main_tel;