【问题标题】:Laravel Eloquent setting a default value for a model relation?Laravel Eloquent 为模型关系设置默认值?
【发布时间】:2013-12-20 15:04:06
【问题描述】:

我有两个模型:

class Product extends Eloquent {

    ...

    public function defaultPhoto()
    {
        return $this->belongsTo('Photo');
    }

    public function photos()
    {
        return $this->hasMany('Photo');
    }
}

class Photo extends Eloquent {

    ...

    public function getThumbAttribute() {
        return 'products/' . $this->uri . '/thumb.jpg';
    }

    public function getFullAttribute() {
        return 'products/' . $this->uri . '/full.jpg';
    }

    ...

}

这很好用,我可以调用$product->defaultPhoto->thumb$product->defaultPhoto->full 并获取相关图像的路径,然后使用$product->photos 获取所有照片并循环访问这些值。

当产品没有照片时会出现问题,我似乎无法找到为这种情况设置默认值的方法。

我尝试过做一些事情,例如

public function photos() 
{
    $photos = $this->hasMany('Photo');
    if ($photos->count() === 0) {
        $p = new Photo;
        $p->url = 'default';
        $photos->add($p);
    }

    return $photos;
}

我还创建了一个全新的Collection 来存储新的Photo 模型,但它们都返回相同的错误:

Call to undefined method Illuminate\Database\Eloquent\Collection::getResults()

有没有人做过类似的事情?

提前致谢!

【问题讨论】:

  • 我不会把这种行为放在模型中。我会简单地使用 - if ( $product->photo === null ) { do something } - 在控制器/视图中。
  • 如果你想为这些项目应用默认值,在数据库级别不是更好吗?这将允许一致地处理 NULL 情况。
  • 我在视图中采取了以下措施:{{ $product->defaultPhoto ? $product->defaultPhoto->thumb : '/img/default-product.png' }}

标签: php laravel laravel-4 eloquent


【解决方案1】:

您可以在为您进行检查的 Product 模型上创建访问器。如果您只是想将其定义为方法,也可以使用相同的方法(如果您想抽象一些 Eloquent 调用,为您的产品使用接口以防您以后更改它等等)

/**
 * Create a custom thumbnail "column" accessor to retrieve this product's
 * photo, or a default if it does not have one.
 * 
 * @return string
 */
public function getThumbnailAttribute()
{
    $default = $this->defaultPhoto;

    return ( ! is_null($default))
        ? $default->thumb
        : '/products/default/thumb.jpg';
}

您可能还想查看Presenters。在某些情况下有点矫枉过正,但使用起来非常方便(并将此类东西从模型中抽象出来)。

【讨论】:

  • 这个!答案在我的问题中(我已经在照片模型中使用了访问器!)
猜你喜欢
  • 2014-12-05
  • 2013-09-15
  • 2016-02-20
  • 1970-01-01
  • 2016-02-26
  • 2018-05-23
  • 2021-10-01
  • 2018-10-20
  • 2021-07-04
相关资源
最近更新 更多