Обновление сводной таблицы Laravel, когда в сводке есть уникальное поле - PullRequest
0 голосов
/ 03 июня 2019

У меня есть две модели, Пользователь и Сервис, с отношением ManyToMany . Сводная таблица имеет два дополнительных поля, id_code и alias. Между Пользователем и Сервисом может быть много связей, но каждая из них уникально идентифицируется полем id_code. Мне нужно получить конкретную запись в сводной таблице по id_code и обновить alias только для этой записи.

Мои модели:

Пользователь:

class User extends Authenticatable
{
    //All attributes & other functions here...

    public function linked_services(){
        return $this->belongsToMany(Service::class)
                        ->withPivot('alias', 'id_code')
                        ->withTimestamps();
    }
}

Услуги:

class Service extends Model
{
    //All attributes & other functions here...

    public function linked_users(){
        return $this->belongsToMany(User::class)
                       ->withPivot('alias', 'id_code')
                       ->withTimestamps();
    }
}

Миграция пользователя службы:

Schema::create('service_user', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedBigInteger('user_id')->nullable();
        $table->unsignedBigInteger('service_id');
        $table->string('alias', 50)->nullable();
        $table->string('id_code', 50);

        $table->foreign('user_id')->references('id')->on('users');
        $table->foreign('service_id')->references('id')->on('services');

        $table->timestamps();
    });

В функции обновления я получаю конкретный $ id_code из представления, но я не знаю, как обновить «псевдоним» для этого конкретного «id_code».

Что я уже пробовал и не работает:

public function update(Request $request, String $id_code){

    foreach(Auth::user()->linked_services as $service){
        if($service->pivot->id_code === $id_code){
            $service->pivot->alias = $request->alias;
            $service->pivot->save();
        }
    }    
    return redirect()->route('services_user.index');
}

Эта функция обновляет ВСЕ существующие сводные записи для service_user, мне нужно обновить только конкретную запись для данного "id_code".

1 Ответ

0 голосов
/ 06 июня 2019

Я решил это !!!Я расскажу вам, как:

Auth::user()->linked_services()
               ->wherePivot('id_code', $id_code)
               ->update(['alias' => $request->alias]); 

Я узнал, что $user->linked_services() (в отличие от $user->linked_services) возвращает объект отношения (в данном случае belongsToMany), который содержит все данные отношения (промежуточная таблица,К этому объекту можно получить доступ к сводным точкам, FK, родительским / связанным объектам и т. д.), а также к нужному сводному элементу с помощью ->wherePivot().

...