【问题标题】:Does Laravel Sync Delete and Re-Create?Laravel 同步删除并重新创建吗?
【发布时间】:2020-01-22 23:19:39
【问题描述】:

我正在寻找有关 Laravel Sync 实际工作原理的更多信息。我有一个包含以下内容的关系表

group_id, user_id, permission, created_at, updated_at

我正在生成一个数组以像这样传递给同步命令。

$groups_array[$group_id] = ['permission' => 0];

当我这样做然后调用同步时,它会将现有关系上的 created_at 和 updated_at 日期设置为 NULL。期望的效果是让它仅将现有关系上的权限值更新为 0,而不将 created_at 和 updated_at 值设置为 NULL。

似乎 Sync 正在删除所有内容,只是根据发送的数组重新创建关系。有没有办法告诉它更新现有关系与删除并重新创建它们?

【问题讨论】:

  • 你能提供更多代码吗?我已经尝试过您提到的内容,它不会覆盖 created_at 或 updated_at 时间戳。你确定它们是最初设置的吗?因为 Laravel 默认不为数据透视行设置时间戳。
  • 向下看属于很多关系,它会尝试更新你的pivot,所以要么是同步调用中的错误,要么是滥用关系。这个问题的代码有点稀疏,所以请包括更多:)

标签: laravel eloquent


【解决方案1】:

默认情况下Laravel中的多对多关系不包括时间戳,您需要在关系上定义它。

public function users()
{
    return $this->belongsToMany(User::class)->withTimestamps();
}

【讨论】:

  • 我不确定这是否能解决您的问题,但至少值得一试:)
  • 这不是我遇到的问题的确切解决方案。问题本身与 Backpack Laravel 处理多对多关系的方式更相关,但这在没有完全改变问题的情况下接近答案。
【解决方案2】:
// Post Model
    public function categories()
    {
        return $this->belongsToMany('App\Category')->withTimestamps();
    }

    public function tags()
    {
        return $this->belongsToMany('App\Tag')->withTimestamps();
    }
// Tag Model
 public function posts()
    {
        return $this->belongsToMany('App\Post')->withTimestamps();
    }
// Category Model
 public function posts()
    {
        return $this->belongsToMany('App\Post')->withTimestamps();
    }
// Post Controller Update
public function update(Request $request, Post $post)
    {
         $this->validate($request,[
            'title' =>'required',
            'categories' => 'required',
            'tags' => 'required'
        ]);




        $post->user_id = Auth::id();
        $post->title = $request->title;
        $post->slug = str_slug($request->title);
        $post->save();
        $post->categories()->sync($request->categories);
        $post->tags()->sync($request->tags);
        Toastr::success('Post Successfully Updated:)','Success');
        return redirect()->route('admin.post.index');
    }

// Delete
public function destroy(Post $post)
    {

        $post->categories()->detach();
        $post->tags()->detach();
        $post->delete();
        Toastr::success('Post Successfully Deleted :)','Success');
        return redirect()->back();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多