php - updateorcreate - Herencia en el marco de Laravel
updateorcreate laravel (2)
¿Es posible usar la herencia en el modelo de Laravel? Yo explico:
Es posible ejecutar un modelo, que extiende una clase elocuente?
class A extends Eloquent
{
}
class B extends A
{
}
A e B también son 2 tablas diferentes y B tiene A_id como clave externa y otros campos. ¿Cómo podría ser el constructor de la clase B? ¿es una solución ragionable o mejor uso hasOne relación?
no todos los objetos A son también objetos B Es. usuario y profesor
Gracias
Resuelvo con
class A extends Eloquent
{
protected $table = ''a'';
}
class B extends A
{
protected $table = ''b'';
protected $primaryKey = ''a_id'';
}
pero en la función principal:
$f = B::find(1);
$f->method();
donde el método () es un método de clase A, el sistema me da un error mysql:
select * from
C where
C. B_id = 1
el error es B_id. Debería ser A_id porque el método se aplica desde subobjeto de la clase, no desde la clase
Tengo dificultades para entender los detalles adicionales, pero en respuesta a la pregunta real: sí, es posible ampliar los modelos Eloquent.
<?php
class User extends /Eloquent {
protected $table = ''users'';
}
class Student extends User {
protected $table = ''students'';
}
Sin embargo, ten en cuenta que cualquier método (como relaciones, ámbitos, etc.) se propagará a la clase extendida. Si no se desea, cree una clase base que tenga el mínimo de lo que necesita y luego subclasifique con sus tipos específicos, es decir, Student
, Administrator
, etc.
Otro enfoque es usar interfaces. Entonces, si sabes que los modelos necesitan los mismos atributos, dirán que tienen diferentes relaciones; entonces puedes crear una interfaz para agregar esas restricciones:
<?php
interface UserInterface {
public function getName();
}
class User extends /Eloquent implements UserInterface {
protected $table = ''users'';
public function getName()
{
return $this->name;
}
}
class Student extends /Eloquent implements UserInterface {
protected $table = ''students'';
public function getName()
{
return $this->name;
}
public function courses()
{
return $this->belongsToMany(''Course'');
}
public function grades()
{
return $this->hasMany(''Grade'');
}
}