Обновление столбца, существующего в таблице отношений многие ко многим в 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');
}