Laravel - не может сохранить отношение morphToMany в цикле foreach - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть следующие 2 модели в отношении morphToMany: Company и Tag

    public function tags(){
    return $this->morphToMany(Tag::class, 'taggable');
    }
    public function companies(){
    return $this->morphedByMany(Company::class, 'taggable');
    }

, и у меня есть следующее рабочее действие для сохранения 1 тега в 1 компании:

   public function addTag($request){
        $company = Company::find($request->company_id);
        $company->tags()->syncWithoutDetaching($request->tag_id);
        return response()->json($company->tags, 201); 
    }

сейчас я пытаюсь сделать то же самое со многими компаниями и многими тегами, и это не работает.Я пытался "syncWithoutDetaching", "saveMany", передавая массив целых чисел или строк, я получаю эту ошибку:

 BadMethodCallException: Method Illuminate\Database\Eloquent\Collection::tags does not exist. in file /home/vagrant/.../vendor/laravel/framework/src/Illuminate/Support/Traits/Macroable.php on line 100

Это функция, которую я использую:

        public function  multiCompanyAddTags($request){

        $tags = $this->createManyRecords('App\AppSections\CRM\Models\Tag', $request->new_tags);
        $tagIDs = $tags->map(function ($item, $key) { return $item->id;
        });

        foreach ($request->companies as $key=>$id) 
        {  
            $company = Company::with(['notes','tags','contacts','tasks'])->find($id);

            $company->tags()->syncWithoutDetaching($tagIDs);

            return response()->json($company, 201); 
        }
}

1 Ответ

0 голосов
/ 28 ноября 2018

Кто-то указал мне на ответ: при вызове $ company = Company :: with ... в моем цикле вызов возвращает коллекцию, а не компанию.

Затем мне нужно вызвать первый элементиз коллекции для доступа к компании, вот так:

$company[0]->tags()->syncWithoutDetaching($tagIDs);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...