如果不存在,则返回自定义有一个关系

时间:2017-01-09 17:10:07

标签: php laravel eloquent

我有用户表,使用hasOne关系链接到设置表。 我正在使用每个用户注册的默认值保存这些设置,以后可以更改。 但有没有办法我不必在数据库中保存这些默认值,如果数据库中不存在设置,只需通过模型返回这些默认设置。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用Model的访问器方法。

在你的模型中试试这个。

$default; //Define your default setting   

public function getSettingAttribute($value) {
    $setting = $this->setting()->first();
    return ($setting!=null) ? $setting : $default;
}

答案 1 :(得分:0)

以下是我添加到用户模型的代码。现在我可以通过设置访问器获取所有设置。如果保存在数据库中,它将返回关系中定义的默认表中的关系,如果不在数据库中,它将创建与我们希望它们返回的默认属性的完整关系,如设置属性例如,名称为 someSettingName

/**
 * The accessors to append to the model's array form.
 *
 * @var array
 */
protected $appends = ['settings'];

/**
 * RETURN the settings of user.
 *
 * @param  int  $id
 * @return string
 */
public function getSettingsAttribute()
{
        // if no relation in db then build it
        if ($this->defaults === null)
        {
            // get the real relation
            $defaults                       = $this->defaults()->getRelated();
            // get the foreign key
            $foreignKey                     = $this->defaults()->getPlainForeignKey();
            // set foreign key
            $defaults->{$foreignKey}        = $this->getKey();
            // set the settings object's properties here
            $defaults->someSettingName      = 0;
            // result to be completely same as real collection :-)
            $defaults->created_at           = '2016-10-11 00:00:00';
            $defaults->updated_at           = '2016-10-11 00:00:00';
            // now set the relation query
            $this->setRelation('defaults', $defaults);
        }
        return $this->defaults;
}


/** Get the settings of the user. */
public function defaults()
{
    return $this->hasOne('App\Models\Defaults');
}