Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 具有默认值的Laravel模型方法_Php_Laravel_Laravel 5_Eloquent - Fatal编程技术网

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';
}