如果关系已存在,则Laravel save()

时间:2018-01-19 11:17:16

标签: php laravel relationship

我目前正在使用save()功能(doc),因此请将子项目保存到父级。但是,孩子已经附属于父母的情况不予处理。

所以我创造了这个:

//Validation stuff

$parent = Task::find( request('parent') );
$child = Task::find( request('child') );

if ( \DB::table('task_has_predecessors')
            ->where('child_id', request('child'))
            ->where('parent_id' , request('parent'))
            ->count() == 0 )
{
    if ( $parent->childs()->save($child) ) 
    {
        flash('Link saved.');
    } 
    else 
    {
        flash()->error('Unable to create the link.');
    } 
}
else
{
    flash()->warning('This link already exist.');
}

但我不是这个解决方案的忠实粉丝......有没有更好的方法来实现这一目标而不使用if ( \DB::table('...')->where(...)->where(...)->count() == 0 )

laravel是一种管理这种行为的神奇方法吗?

我没有与tasks_has_predecessors表相关的任何模型。 我的关系是这样的:

class Task extends Model
{
    public function childs()
    {
        return $this->belongsToMany(ChecklistCategoryTask::class, 'task_has_predecessors',  'parent_id','child_id');
    }

    public function parents()
    {
        return $this->belongsToMany(ChecklistCategoryTask::class, 'task_has_predecessors' , 'child_id' , 'parent_id');
    }
}

2 个答案:

答案 0 :(得分:0)

如果您尝试将一个模型附加到另一个模型,请使用attach()方法而不是保存和ID而不是对象:

$parent->childs()->attach($child->id);

如果您尝试创建新对象,请使用findOrNew()代替find()

$child = Task::findOrNew(request('child'));

如果该对象尚不存在,则该方法将创建一个新对象。

答案 1 :(得分:-1)

请参阅Belongs To Relationships

来自doc

$account = App\Account::find(10);
$user->account()->associate($account);
$user->save();