Laravel Eloquent - Morph 关系上的sync()

Kou*_*sha 5 laravel eloquent laravel-4

Laravel 上似乎没有sync()变形表的功能。

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

Avail::find($id)->questions()->sync($some_ids);
Run Code Online (Sandbox Code Playgroud)

这给了我以下错误:

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

那么有没有办法去sync上班,或者我只是做得不对?

Jar*_*zyk 5

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());
Run Code Online (Sandbox Code Playgroud)

现在:

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

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