Есть ли общий способ обновления двух объединенных таблиц в Laravel? - PullRequest
1 голос
/ 01 июля 2019

Я пытаюсь обновить две таблицы в Laravel. Но я не знаю, сможете ли вы сделать это при использовании ассоциативного массива с помощью Object-> update ($ associative-array);

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

  1. $user->update($attributes);
  2. $user->update($attributes); $location->update($attributes);

Но это только обновит пользовательскую таблицу и пропустит таблицу местоположений. Массив $ attribute содержит данные нескольких столбцов пользователя и местоположения таблицы. Массив находится в порядке от первого столбца таблицы пользователя до последнего столбца таблицы местоположений.

Но ни одна из этих попыток не обновила обе таблицы. Они только обновляют пользователя и пропускают местоположение. Насколько я знаю, вы можете сделать это таким образом с ассоциативным массивом, если массив содержит данные столбца в том же порядке таблицы, а Laravel сделает все остальное. Он работает только с обновлением пользовательской таблицы, но я хочу, чтобы он работал с двумя таблицами так, как он работает, используя функцию обновления объекта.

Таблицы MySQL

users:
   id
   firstname
   middlename
   lastname
   active
   email
   password
   phone
   mobile_work
   phone_work
   gender
   position_id
   settling_id
   location_id

locations:
   id
   street
   house_number
   addition
   zipcode
   city
   province
   country
public function update(Request $request, User $user, Location $location)
{
    $attributes = request()->validate([
        'firstname' => 'min:3|max:50',
        'middlename' => 'max:50',
        'lastname' => 'min:3|max:50',
        'active' => 'required',
        'email' => 'min:3|max:100',
        'gender' => '',
        'phone' => 'numeric|min:8',
        'mobile_work' => 'numeric|min:8',
        'phone_work' => 'numeric|min:8',
        'position_id' => '',
        'settling_id' => '',
        'location_id' => '',
        'street' => 'required|min:3',
        'house_number' => 'required|numeric',
        'addition' => '',
        'zipcode' => 'required|min:6|max:7',
        'city' => 'required|min:3',
        'province' => 'required|min:3',
        'country' => '',
    ]);

    $user->update($attributes);
}

Если способ, которым я пытаюсь это сделать, невозможен, я хотел бы услышать, каков стандартный подход при обновлении двух таблиц в одной последовательности обновления.

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Я сделал ошибку, чтобы не включать функцию местоположений от пользователя модели в последовательность обновления.

Модель пользователя:

    public function locations()
    {
        return $this->hasOne(Location::class, 'id', 'location_id');
    }

Я исправил проблему, просто разделив массив $ attribute на 2 массива с их собственными данными столбцов таблицы. Я также сделал второе утверждение, которое вызывает функцию определения местоположения из модели и обновляет ее соответствующим образом.

  $user->locations()->update($locationAttributes);
  $user->update($attributes);

С атрибутами $, содержащими только информацию о пользователе, и $ locationAttributes, содержащими только информацию о местоположении.

$ location () относится к строке в расположениях таблицы. Он знает, какую строку выбрать, беря location_id у выбранного пользователя.

0 голосов
/ 01 июля 2019

То, что вы пытаетесь сделать, не совсем правильно. Вы также должны попытаться обновить отношение, и желательно сначала как

$location->update($locationAttributes);
$user->update($userAttributes);

Кстати, не совсем понятно, хотите ли вы обновить запись о местоположении или хотите связать новое местоположение с пользователем. Если это последнее, то вы можете связать местоположение с пользователем, как

$user->locations()->attach($locationId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...