Laravel обновляет отношения один-ко-многим - PullRequest
0 голосов
/ 26 августа 2018

У меня есть запрос, который содержит следующие данные

{
  "path": "some path",
  "site_link": "http://example.com"  
  "features": [ ... ] //array of strings
}

Я хочу обновить две таблицы site и site features.

site Таблица содержит | id | path | site_link |.

и site features эти | id | feature | site_id | Я не знаю точного количества "функций", однако мне нужно обновить их после запроса.

Есть ли способ обновить их за исключением для удаления, а затем создать еще раз.(некоторые функции могут быть изменены, некоторые могут быть удалены и добавлены).

На данный момент у меня нет кода для обновления функций.Только это

public function update(Request $request, Site $site)
    {
        $site->update([
            "path" => $request->path,
            "site_link" => $request->link
        ]);

        return response()->json($site, 200);
    }

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Ну, во-первых, надеюсь, что вы создали модель для таблицы возможностей сайта.Это довольно легко.Теперь после этого

$updates =  SiteFeatures :: where ('feature',$feature)->where('site_id',$siteID) ->get();

для обновления: -

$updates->feature = $newFeature;
$updates->save();

для удаления: -

$updates->delete();

для добавления новой функции вам не нужна перваязаявление вместо

$newFeature = new SiteFeatures();
$newFeature->feature = 'the new feature';
$newFeature->site_id = the_site_id;
$newFeature->save();
0 голосов
/ 26 августа 2018

Ну, в вашей ситуации вы не можете обновить строки site_features примерно так.Потому что вам нужно второй идентификатор в таблице site_features.Ниже запрос обновляет только первый столбец снова и снова.Таким образом, единственный способ сохранить эти функции create новые строки с помощью метода create.

Если вы хотите обновить определенный столбец site_features, вы должны передать идентификаторы этих функций в контроллер

public function update(Request $request, Site $site)
    {
       // first you need to select a row before updating it
        $site = $site->where("site_link",$request->site_link)->first(); 
        $site->update([
            "path" => $request->path,
           ]);

        foreach($request->features as $feature){
            SiteFeature::where("id",$feature->id)
             ->update([
                "feature" => $feature->content
             ]);
          }

        return response()->json($site, 200);
    }

Если у вас еще нет параметра id, если это новые функции, вы должны создать новые записи о них

public function update(Request $request, Site $site)
    {
        $site = $site->where("site_link",$request->site_link)->first(); 
        $site->update([
            "path" => $request->path,
           ]);

        foreach($request->features as $feature){
            SiteFeature::create([
                "feature" => $feature
             ]);
          }

        return response()->json($site, 200);
    }

И есть третий путь к этому.Если ваши возможности ограничены.Например, есть только 80 функций об этих сайтах.Некоторые веб-сайты имеют некоторые функции, а другие нет. Тогда вы можете захотеть использовать отношения many to many.Создайте таблицу характеристик и добавьте все функции, а также сделайте многое для многих в отношениях между функциями и сайтами.После этого вам нужно только синхронизировать эти функции.Это очень просто в использовании.А также, когда вам нужно внести некоторые изменения в одну из функций.Вы не должны делать массовые изменения.Просто измените эту функцию в таблице функций, а затем примените ее ко всем веб-сайтам.

Надеюсь, вы меня понимаете, потому что мой английский такой ужасный:)

...