Pregunta

Tengo las siguientes tablas:

Usuario:

userID
...

Lección:

lessonID
...

Users_Lessons_Status (que actúa como un pivote de la tabla y tiene otra información):

userID references User.userID
lessonID references Lessons.lessonID
latestSectionID
percentComplete

Lo que quiero hacer es, para cada usuario, para cada lección, debe haber una fila de la tabla dinámica, que le dice lo mucho que el usuario ha finalizado en esa lección, y cuál es su última sección de IDENTIFICACIÓN fue.Es decir, debe haber un único par con userID y lessonID (las claves primarias?).

He configurado mis modelos como:

<?php

class User extends Eloquent implements UserInterface, RemindableInterface {

...


    public function lessonStatuses() 
    {
        return $this->belongsToMany('Lesson', 'users_lessons_status', 'lessonID', 'userID')->withPivot('latestSectionID', 'percentComplete');
    }

}

<?

class Lesson extends Eloquent {

protected $table = 'lessons';
protected $primaryKey = 'lessonID';

public function userStatuses()
{
    return $this->belongsToMany('User', 'users_lessons_status', 'userID', 'lessonID');
}


}

?>

Mi ruta actual se parece a esto:

Route::post('dbm/users/setLatestSectionID', function() {
    if(Auth::check()) {
        $user = User::find(Input::get('userID'));
        $lesson = Lesson::find(Input::get('lessonID'));
        $us = $user->lessonStatuses(); 
        $us->attach($lesson->lessonID, 
            ["latestSectionID" => Input::get('latestSectionID'), "percentComplete" => Input::get('percentComplete')] );
    }
});

Esto funciona, sin embargo, se crea una nueva fila cada vez que la actualizo por el mismo userID y lessonID, de modo que el par ya no es único.Que métodos puedo utilizar para este propósito?He intentado tanto save(), attach() y push() en la documentación pero no estoy seguro de cual usar aquí.

Editar:para aclarar, la tabla resultante debería ser algo como esto:

id|userID|lessonID|latestSectionID|percentComplete
1    1      1             X             Y
2    1      2        
3    1      3         
4    2      1          
5    3      1
6    3      2
....

Edit 2:Fija la User->belongsToMany() método y se añade el withPivot de la llamada.

¿Fue útil?

Solución

Parece un error, sin embargo, usted puede hacer esto:

...->sync([$id], false); // detaching set to false, so it will only insert new rows, skip existing and won't detach anything

Editar: Como se dice en comentario, no funcionará para usted, ya que desea establecer datos de pivote. Así que, básicamente, no hay ningún método para hacer esto en este momento, pero algo así debería hacer:

// belongsToMany.php
public function attachOrUpdate($id, array $attributes = array(), $touch = true)
{
    if ($id instanceof Model) $id = $id->getKey();

    if ( ! $this->allRelatedIds()->contains($id)) // getRelatedIds() in prior to v5.4
    {
        return $this->attach($id, $attributes, $touch); 
    }
    else if ( ! empty($attributes))
    {
        return $this->updateExistingPivot($id, $attributes, $touch);
    }
}

Voy a probarlo y si pasa, envíe una solicitud de extracción a 4.1

Otros consejos

Me enfrenté a este recientemente y se fija en esta forma:

Uso updateExistingPivot primera y comprobar el resultado , si el resultado es 1 eso significa que no eran de la fila con el mismo userID y lessonID y se ha actualizado correctamente, de lo contrario, si el resultado es 0 esto significa que no hay filas con este userID y lessonID, así que usted puede conectar con el fin de crear una nueva fila

    $update_result = $us->updateExistingPivot($lesson->lessonID, 
            ["latestSectionID" => Input::get('latestSectionID'), "percentComplete" => Input::get('percentComplete')] );
    if($update_result == 0) {
        $us->attach($lesson->lessonID, 
            ["latestSectionID" => Input::get('latestSectionID'), "percentComplete" => Input::get('percentComplete')] );
    }

Usted debe estar utilizando updateExistingPivot().

Actualizar el código a utilizar

    $us->updateExistingPivot($lesson->lessonID, 
        ["latestSectionID" => Input::get('latestSectionID'), "percentComplete" => Input::get('percentComplete')], true );

El último parámetro de la actualización de las fechas de registro para todos los modelos relacionados.Si no, usted puede quitar o falso.

Si desea adjuntar sólo cuando un registro no existe, se podría hacer algo como esto...

Route::post('dbm/users/setLatestSectionID', function() {
    if(Auth::check()) {
        $user = User::find(Input::get('userID'));

        $lesson = [
            "latestSectionID" => Input::get('latestSectionID'), 
            "percentComplete" => Input::get('percentComplete')
        ];

        $num_lessons = $user->lessonStatuses()->where('id', Input::get('lessonID'))->count();

        if($num_lessons == 0) {
            $user->attach($lesson->lessonID, $lesson);
        } else {
            $user->updateExistingPivot($lesson->lessonID, $lesson);

        }
    }
});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top