Modelo Laravel guardando datos sin clave principal

4 minutos de lectura

Tengo 2 modelos: Perfil y Estudiante. El perfil contiene una clave principal, identificación. El modelo de estudiante no tiene ninguna clave principal, sino una clave externa, Perfil Id, que enlaza con profile.id. Tengo una función dentro de mi controlador de Estudiante que activa el Estudiante, configurando el estado de 0 a 1, cuando se le llama. Estoy tratando de usar save() para la actualización del valor, pero no puedo hacerlo, me aparece un mensaje como este:

Column not found: 1054 Unknown column 'id' in 'where clause'

¿Puede por favor aconsejar? Muchísimas gracias.

Modelo de estudiante:

class Student extends Eloquent {

    protected $primary_key = null;
    public $incrementing = false;

    protected $fillable = array('username', 'password', 'status', 'profile_id');

    public function profile() {
        return $this->belongsTo('Profile');
    }
}

Modelo de perfil:

class Profile extends Eloquent {

    protected $fillable = array('firstname', 'lastname', 'email', 'phone');

    public function student()
    {
        return $this->hasOne('Student', 'profile_id', 'id');
    }
}

StudentController:

public function activate($id) {
        $student = Student::where('profile_id', '=', $id)->first();
        $student->status = 1;
        $student->save();
        return Redirect::to('students');
}

  • ¿Por qué quieres trabajar con esto? Eloquent no lo hará de todos modos, ya que depende de la clave principal (como cualquier ORM).

    – Jarek Tkaczyk

    21 de agosto de 2014 a las 18:19

  • mira esto coderwall.com/p/lhfzia

    – obispo negro

    21 de agosto de 2014 a las 18:23

avatar de usuario
c-grifo

Es posible que desee considerar agregar un id campo. Es bastante importante para Laravel y los paquetes (para la agregación, específicamente)

pero si debes…

Modelo de estudiante: (el caso de Carmel primaryKey propiedad)

class Student extends Eloquent {

    protected $primaryKey = null;
    public $incrementing = false;


    protected $fillable = array('username', 'password', 'status', 'profile_id');

    public function profile() {
        return $this->belongsTo('Profile');
    }
}

  • Creo que tiene razón sobre la “clave primaria”, pero al intentar cambiarla en el código, tuve un problema de carga al llamar a la función. No estoy seguro de si es realmente el caso de que definitivamente necesito un campo de identificación para trabajar, aunque no tiene ningún propósito en mi caso, sino solo para satisfacer el requisito de necesitar una clave principal.

    – jl.

    21 de agosto de 2014 a las 18:39

  • ¿Cuál es el problema de carga que está experimentando después de cambiar el nombre de la propiedad? Sin duda, puede usar esta tabla con Laravel y sin clave principal, pero puede volverse cada vez más difícil al intentar integrar otros paquetes: Cruddy por ejemplo. Agregar un primary key puede ahorrarle un dolor de cabeza en el futuro y no puedo pensar en ningún caso en el que sería costoso.

    – c-grifo

    21 de agosto de 2014 a las 18:54

  • Tenga en cuenta que la documentación oficial no menciona este caso y, por algunas razones, puede provocar errores inesperados, difíciles de localizar y depurar, por lo que ¡Recomiendo encarecidamente a todos que no hagan esto!

    – Bushikot

    31 de agosto de 2016 a las 7:52

  • Puedo confirmar que configurar el $primaryKey a null simplemente hace que Laravel explote y muestre una pantalla blanca de muerte sin absolutamente ningún registro en ninguna parte, cada vez que se intenta una actualización. Esto funcionará para inserciones, pero no para actualizaciones.

    – Tiro al plato

    12/10/2017 a las 20:57


  • Confirmado, cosas súper fáciles, cuando se trabaja con db directamente, es súper complicado en Laravel. Laravel NECESITA clave principal. Sin él, todo el marco se derrumba y es totalmente inútil. Entonces, diseñe su base de datos con claves primarias, o use algún otro marco, ya que Laravel es inútil para usted.

    – Jeffz

    20 de febrero de 2018 a las 1:49


Tuve el mismo problema y no pude usar un campo de clave principal para esta tabla.

Como Eloquent no puede actualizar tablas como esta, lo resolví simplemente decidiendo actualizar la fila de una manera diferente:

NameOfMyTable::where('entity_type', 1)->update(['last_import' => Carbon::now()]);

avatar de usuario
mushood badulla

Si alguien tiene el mismo problema, utilicé la respuesta de Nishchit Dhanani y funcionó bastante bien:

Escriba esta línea en su modelo:

public $primaryKey = '_id';

Dónde _id es su clave principal manual.

Para mi caso tenia una tabla de usuarios y parte de mis usuarios son estudiantes. Entonces, la clave principal en la tabla de mis estudiantes era “user_id” y agregué esta línea en mi Student modelo:

public $primaryKey = 'user_id';

pude usar el save() método al actualizar mi objeto de estudiante.

En su caso, solo necesitaría agregar esto a su modelo de estudiante:

public $primaryKey = 'profile_id';

¿Ha sido útil esta solución?