Обновление столбца, существующего в таблице отношений многие ко многим в laravel 5.2

у меня есть три таблицы, таблицы, таблицы событий, и Events_user таблице. У меня есть четыре столбца в таблице Events_user, которые:

   Schema::create('events_user', function(Blueprint $table){

            $table->increments('id');
            $table->integer('user_id')->unsigned()->index();
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

            $table->integer('events_id')->unsigned()->index();
            $table->foreign('events_id')->references('id')->on('events')->onDelete('cascade');

            $table->integer('eventstatus')->unsigned()->index();

            $table->timestamps();
        });

у меня есть функция, которая добавляет базу событий на id пользователя, показывает, что один пользователь может иметь много событий. Но событие может поделиться с другим пользователем. Функция такой :

  public function store(EventsRequests $request){

        $id = Auth::user()->id;
        $events= Events::create($request->all());
        $events->user()->attach($id); //Store the User_ID and the Event_ID at the events_user table.

        Flash::success('Your event has been created!');
        return redirect('/');//Return into home page

//        return $events;
    }

тогда это поможет мне обновить таблицу events_user, но как обновить столбец, который является eventstatus? Может кто-нибудь показать мне, как могу ли я обновить его? Потому что я хочу использовать eventstatus, помогите мне определить, есть ли "1", тогда не может быть edit, тогда кнопка edit исчезнет. Сколько способов может выполнить функция?


для страницы показать: Я использую функцию, когда пользователь нажимает событие, которое существует в представлении календаря, тогда javascript передаст идентификатор обратно и перенаправит в представление с идентификатором.

public function show($id){
//            $user_id=Auth::user()->name;
            $showevents = Events::findOrFail($id);
            return view('events.show',compact('showevents','user'));
    }

как насчет того, когда я хочу передать eventstatus в представление? Так что я можете проверить на моем представлении, если eventstatus равен одному, кнопка редактирования не появится.


обновленная модель отношений

пользователей.в PHP

   public function events(){
        return $this->belongsToMany('AppEvents');
    }

событий.в PHP

   public function user(){
        return $this->belongsToMany('AppUser')->withPivot('eventstatus');
    }

2 ответов


если вы хотите обновить поле при создании Ассоциации, вы можете передавать массив field=>value пар в качестве второго параметра attach() метод. Вы можете прочитать в документации здесь.

$events->users()->attach($id, ['eventstatus' => 1]);

если вы хотите обновить поле для существующей ассоциации, вы можете передавать массив field=>value пар save() способ:

$user = Auth::user();
$event = $user->events()->first();
$user->events()->save($event, ['eventstatus' => 1]);

если вы хотите получить доступ к полю для чтения данных, вы можете получить доступ к нему через pivot свойство:

$user = Auth::user();
foreach ($user->events as $event) {
    echo $event->pivot->eventstatus;
}

в дополнение ко всему этому, вы должны убедиться, что ваши определения отношения включают доступ к дополнительные свойства:

// User class:
public function events() {
    return $this->belongsTo(Event::class)->withPivot('eventstatus');
}

// Event class:
public function users() {
    return $this->belongsTo(User::class)->withPivot('eventstatus');
}

редактировать

обновленный ответ на дополнительный вопрос

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

так как у вас есть событие, вы необходимо просмотреть связанные модели пользователей, найти нужного пользователя (при условии, что пользователь вошел в систему), а затем получить статус атрибута pivot для этого пользователя.

public function show($id)
{
    // get your event
    $showevents = Events::findOrFail($id);

    // get your user
    $user = Auth::user();

    // default status to send to view
    $status = 0;

    // if there is a user...
    if ($user) {
        // find the user in the "user" relationship
        // NB: calling "find" on a Collection, not a query
        $eventUser = $showevents->user->find($user->id);

        // if the user is associated to this event,
        //   get the status off the pivot table,
        //   otherwise just set the default status
        $status = $eventUser ? $eventUser->pivot->eventstatus : $status;
    }

    // add your status to the data sent to the view
    return view('events.show', compact('showevents', 'user', 'status'));
}

в дополнение ко всему этому, убедитесь, что оба определения относятся к ->withPivot('eventstatus'). Вы хотите убедиться, что можете добраться до него с обеих сторон, если понадобится.


можете ли вы поделиться своим кодом отношений модели событий и пользователей? это поможет мне проникнуть глубже.

или вы можете попробовать это в модели событий как:

public function user()
{
    return $this->belongsToMany('App\Event')
        ->withPivot('eventstatus')
        ->withTimestamps();
}

затем при обновлении вы можете сделать что-то подобное я не уверен, но надеюсь, что это поможет.

$events->user()->attach($id,['eventstatus' => 1]);

спасибо

для получения дополнительной колонки:

public function show($id){
        $showevents = Events::findOrFail($id);
        $event_status = $showevents->pivot->eventstatus;
        return view('events.show',compact('showevents','event_status'));
}

но для этого вы должны определить этот столбец в моделях:

// User class:
public function events() {
    return $this->belongsTo(Event::class)->withPivot('eventstatus');
}

// Event class:
public function users() {
    return $this->belongsTo(User::class)->withPivot('eventstatus');
}