Tengo tres tablas que son tabla de usuarios, tabla de eventos y tabla de eventos_usuario. Tengo cuatro columnas en la tabla Events_user que son:

   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();
        });

Tengo una función que agrega una base de eventos en la identificación del usuario, muestra que un usuario puede tener muchos de los eventos. Pero el evento se puede compartir con otro usuario. La función es así:

  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;
    }

Entonces me ayudará a actualizar mi tabla events_user, pero ¿cómo actualizo la columna que es eventstatus? ¿Alguien puede mostrarme cómo puedo actualizarlo? Porque quiero usar eventstatus, ayúdame a determinar si hay '1', entonces no se puede editar, luego el botón de edición desaparecerá. ¿De cuántas maneras se puede lograr la función?


Para la página de presentación: utilicé la función cuando el usuario hace clic en el evento que existe en la vista del calendario, luego javascript devolverá la identificación y lo redireccionará a la vista con la identificación.

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

¿Qué tal cuando quiero pasar el estado del evento a la vista? Entonces puedo verificar mi vista, si el estado del evento es igual a uno, el botón de edición no aparecerá.


Modelo de relación actualizado

User.php

   public function events(){
        return $this->belongsToMany('App\Events');
    }

Eventos.php

   public function user(){
        return $this->belongsToMany('App\User')->withPivot('eventstatus');
    }
9
Ben 28 ene. 2016 a las 09:14

2 respuestas

La mejor respuesta

Si desea actualizar el campo mientras realiza la asociación, puede pasar una matriz de pares field=>value como segundo parámetro al método attach(). Puede leer la documentación aquí.

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

Si desea actualizar el campo de una asociación existente, puede pasar una matriz de pares field=>value al método save():

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

Si desea acceder al campo para leer los datos, puede acceder a él a través de la propiedad pivot:

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

Además de todo esto, debe asegurarse de que las definiciones de su relación incluyan acceso a la propiedad adicional:

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

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

Editar

respuesta actualizada para preguntas adicionales

Para obtener la información que está buscando, debe poder acceder al registro dinámico. El registro pivote está disponible en los modelos de la relación cargada.

Dado que tiene el evento, debe revisar los modelos de usuario relacionados, encontrar el usuario que desea (asumiendo que el usuario ha iniciado sesión) y luego obtener el estado del atributo pivote de ese usuario.

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'));
}

Además de todo esto, asegúrese de que ambas definiciones de relación incluyan el ->withPivot('eventstatus'). Desea asegurarse de poder acceder a él desde ambos lados, si es necesario.

7
patricus 28 ene. 2016 a las 08:18

¿Puede compartir su evento y el código de relación del modelo de usuario? entonces, me ayudará a profundizar.

O puede probar esto en un modelo de evento como:

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

Luego, mientras se actualiza, puede hacer algo como esto, no estoy seguro, pero espero que esto ayude.

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

Gracias

Para obtener una columna adicional:

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

Pero para eso tienes que definir esta columna en modelos:

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

// Event class:
public function users() {
    return $this->belongsTo(User::class)->withPivot('eventstatus');
}
3
Amit Ramoliya 28 ene. 2016 a las 07:17