有两个表
在我的产品型号中,我可以使用以下内容获取所有照片:
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
这是非常意大利面条,功能会好得多。
我可以创建一个全局辅助函数,但我很好奇我是否可以将它添加到我的模型中。
答案 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 !!}}