有两个表
- 产品
- 图片(有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 !!}}