php – Laravel Eloquent为模型关系设置默认值?

我有两个型号:

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->照片和循环获取所有照片通过价值观.

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

我尝试过这样的事情

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()

有人做过类似的事吗?

提前致谢!

解决方法:

您可以在产品模型上创建一个访问者,为您进行检查.如果您只想将其定义为一种方法,也可以使用相同的方法(如果您想要抽象一些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.在某些情况下有点矫枉过正,但是非常方便(并且这样的抽象事物远离你的模型).

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...