【问题标题】:Laravel Eloquent - sync() on a Morph relationshipLaravel Eloquent - 变形关系上的同步()
【发布时间】:2014-09-23 02:51:47
【问题描述】:

似乎 Laravel 上没有用于变形表的 sync() 函数。

我有两张桌子availsquestionsquestions 是一个 morphMany 表。我想使用同步命令,这就是我所做的:

Avail::find($id)->questions()->sync($some_ids);

这给了我以下错误:

调用未定义的方法 Illuminate\Database\Query\Builder::sync()

那么有没有办法让sync 工作,还是我做的不对?

【问题讨论】:

    标签: laravel laravel-4 eloquent


    【解决方案1】:

    morphMany 是一对多,不是多对多的关系,所以没有sync 方法。

    请改用saveMany/save,反之则使用associate


    要为这种关系模仿 sync 行为,您可以这样做:

    $questionsOld = $avail->questions()->get();
    
    $questionsOld->each(function ($question) {
      // appropriate fields here:
      // 1*
      $question->FOREIGN_ID = null;
      $question->FOREIGN_TYPE = null;
      $question->save();
    });
    
    $questionsNew = Question::whereIn('id', $someIds)->get();
    
    // *2
    $avail->questions()->saveMany($questionsNew->getDictionary());
    

    现在:

    *1 您不能使用dissociate,必须将relation_idrelation_type 显式设置为null,因为morphTo 不会覆盖此方法,因此无法按预期工作。

    *2 getDictionary() 返回简单的模型数组,而不是集合。这是必需的,因为saveMany 将其参数输入为array

    【讨论】:

    • 有道理。所以我有一个questions 的列表。当我更新它们时,我想基本上同步问题 ID。可能有新问题、删除的问题或只是更新的问题。我将如何在不同步的情况下同步它们?我可以获取 id 列表,并将它们与旧 id 进行比较,然后手动删除/添加/更新
    猜你喜欢
    • 2014-07-20
    • 2019-07-27
    • 2017-04-10
    • 2020-10-20
    • 2020-03-01
    • 1970-01-01
    • 2016-11-21
    • 2016-08-13
    • 2018-02-09
    相关资源
    最近更新 更多