在Laravel中,有没有一种更新两个联接表的通用方法?

时间:2019-07-01 01:33:26

标签: php laravel

我正在尝试在Laravel中更新两个表。但是我不知道您是否可以在使用Object-> update($ associative-array);

我在laravel中做了一个更新序列,用用户表中的外键更新了一个用户和两个单独表中的位置。我尝试使用表对象更新两个表,并执行更新语句。我通过以下方式尝试了此方法:

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

但这只会更新用户表,并跳过位置表。 $ attributes数组包含表用户和位置的多个列数据。数组是从用户表的第一列到位置表的最后一列的顺序。

但是这些尝试都没有更新两个表。他们仅更新用户并跳过位置。据我所知,如果数组包含表中相同顺序的列数据,而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 :(得分:0)

您尝试执行的操作不太正确。您还应该尝试更新该关系,最好先喜欢

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

顺便说一句,您不清楚要更新位置记录还是要将新的位置与用户相关联。如果是后者,则可以将位置与用户相关联

$user->locations()->attach($locationId);

答案 1 :(得分:0)

我犯了一个错误,就是没有将模型User的locations功能包括在更新序列中。

用户模型:

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

我通过简单地将$ attribute数组分配给具有它们自己的表列数据的2个数组来解决了这个问题。我还做了第二条语句,该语句从模型中调用了定位功能,并相应地对其进行了更新。

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

其中$ attributes仅包含用户信息,而$ locationAttributes仅包含位置信息。

$ locations()引用表位置中的行。它通过从所选用户获取location_id来知道要选择哪一行。