使用默认值的Laravel模型方法


Laravel model method with default value

有两个表

    产品
  • 图片(有product_id, priority)

在我的产品模型我可以得到所有的图片:

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

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

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

这给出了错误:

Relationship方法必须返回类型为照亮'关系数据库'雄辩的' '

的关系

当返回一个值时,它的类型永远不会是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

这非常像意大利面,一个函数会更好。

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

我知道您已经有了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

访问它

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

我建议您使用查询范围。例如:

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 !!}}