Php 具有默认值的Laravel模型方法
有两张桌子Php 具有默认值的Laravel模型方法,php,laravel,laravel-5,eloquent,Php,Laravel,Laravel 5,Eloquent,有两张桌子 产品 图片(具有产品标识,优先级) 在我的产品型号中我可以通过以下功能获得所有图片: public function pictures(){ return $this->hasMany('App\Picture'); } 现在我想在product中创建一个方法来获取主图片url(图片的product_id的最低优先级值),如果没有结果,则返回一个默认值。我试过: public function mainpicture(){ $picture = $this
- 产品
- 图片(具有产品标识,优先级)
public function pictures(){
return $this->hasMany('App\Picture');
}
现在我想在product中创建一个方法来获取主图片url(图片的product_id的最低优先级值),如果没有结果,则返回一个默认值。我试过:
public function mainpicture(){
$picture = $this->pictures()->orderBy('priority','desc')->first();
if($picture == null)
return 'default/default.png';
return $picture->url;
}
这会产生以下错误:
关系方法必须返回类型为的对象
照亮\数据库\雄辩\关系\关系
当返回一个值时,它的类型决不是lightize\Database\Eloquent\Relations\Relations,而只是一个url。
如何创建获取主图片或默认值的方法
我想创建这个函数的原因是:因为我在很多视图中都需要它,而不想在每个视图中都粘贴相同的代码。
当前在我需要使用主图片的所有视图中:
这非常像意大利面条,功能会更好
我可以创建一个全局助手函数,但我想知道是否可以将其添加到我的模型中。我建议您使用。例如:
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 !!}}
我知道Kota已经有了一个有效的解决方案。但我是否可以建议另一种方法: 在Laravel中,您可以定义用于获取属性的自定义逻辑 它们的定义如下:
public function getCustomAttribute()
{
return 'foo';
}
因此,在你的情况下:
public function getMainpictureAttribute()
{
$picture = $this->pictures()->orderBy('priority')->first();
return ($picture) ? $picture->url : 'default/path.jpg';
}
在您的视图中,您现在可以使用$product->main picture
那有多干净?并为每个产品保存一个附加查询 谢谢你的建议。问题是,我需要将它添加到我需要它的视图的每个控制器函数中,如果我可以在我需要它的视图中调用$product->mainpicture,那就容易多了。你可以调用$product->mainpicture。尝试它我已经将它添加到我的视图中,如{!!$product->MAINTPICTURE->url!!}我得到一个错误“尝试获取非对象的属性”,如果没有结果,我仍然没有默认值。你不应该在视图中这样做。只需将最后一个$main\u picture\u url从控制器发送到视图中。见我编辑的答案谢谢你的建议,我赞同科塔·佩特的解决方案。这样,我就不需要向控制器添加任何内容。
public function getMainpictureAttribute()
{
$picture = $this->pictures()->orderBy('priority')->first();
return ($picture) ? $picture->url : 'default/path.jpg';
}