具有默认值的Laravel模型方法

时间:2015-10-17 13:19:58

标签: php laravel laravel-5 eloquent

有两个表

  • 产品
  • 图片(有product_id,优先级)

在我的产品型号中,我可以使用以下内容获取所有照片:

public function pictures(){
    return $this->hasMany('App\Picture');
}

现在我想在产品中创建一个方法来获取主图片网址(图片的product_id的最低优先级值),如果没有结果则返回默认值。我试过了:

public function mainpicture(){
    $picture = $this->pictures()->orderBy('priority','desc')->first();
    if($picture == null)
        return 'default/default.png';
    return $picture->url;
}

这给出了错误:

  

关系方法必须返回一个类型的对象   照亮\数据库\锋\关系\关系

当返回一个值时,它永远不会是Illuminate \ Database \ Eloquent \ Relations \ Relation类型,而只是一个url。 如何制作获取主图片或默认值的方法?

我想创建这个函数的原因是:因为我需要很多视图,并且不想在每个视图中粘贴相同的代码。 目前在我需要使用的主图片的所有视图中:

@if(isset($product->pictures[0]))
    {!! Html::image('/images/product/'.$product->id.'/thumb/'.pictures[0]->url, 'Product image', array('class'=> ' img-responsive')) !!}
@else
    {!! Html::image('/images/product/default/default.png', 'No picture found', array('class'=> ' img-responsive')) !!}
@endif

这是非常意大利面条,功能会好得多。

我可以创建一个全局辅助函数,但我很好奇我是否可以将它添加到我的模型中。

2 个答案:

答案 0 :(得分:4)

我知道你已经有了Kota的工作解决方案。但我可以建议一种替代方法:

在Laravel中,您可以定义用于获取属性的自定义逻辑。

它们的定义如下:

public function getCustomAttribute() 
{
     return 'foo';
}

所以在你的情况下:

public function getMainpictureAttribute()
{
    $picture = $this->pictures()->orderBy('priority')->first();
    return ($picture) ? $picture->url : 'default/path.jpg';
}

在您看来,您现在可以使用$product->mainpicture

访问它

现在有多干净?并为每个产品保存一个额外的查询。

答案 1 :(得分:-1)

我建议你使用Query Scope。例如:

class Product extends Model
{
    public function scopeMainpicture($query)
    {
        return $query->orderBy('priority','desc');
    }

}

然后在控制器中,您可以将其用作:

$main_picture_url = $product->mainpicture()->first()->url;

//send it to the view
return ('myview').with('main_picture_url',$main_picture_url);

然后在视图中,执行此操作:

{{!! $main_picture_url !!}}