Tengo una tabla llamada categories y aquí está su estructura:
id bigint(20) AUTO_INCREMENT name varchar(255) description varchar(255) short_name varchar(255) picture varchar(255) parent_category int(11) category_type tinyint(4) Entonces, cada categoría tiene un tipo de category_type que puede ser uno de estos valores:
1 : Categoría principal
2 : Categoría superior
3 : Categoría Secundaria
4 : Subcategoría secundaria
Ahora quería establecer una relación de uno a muchos entre estas categorías.
Por ejemplo: una categoría principal tiene muchas categorías superiores y una categoría superior está relacionada con una categoría principal.
Y esto se aplicará al resto de ellos también.
Pero debido a que solo tengo un Modelo que es Category , no sé cómo aplicar esta relación, así que si lo sabe, por favor ayúdeme...
Category.php de modelo.php:
class Category extends Model { use HasFactory; protected $fillable = ['name','short_name','description','picture','category_type','parent_category']; }Puede escribir las siguientes relaciones en el modelo Categoría:
public function parentCategory() { return $this->belongsTo(Category::class, 'parent_category', 'id'); } public function childCategories() { return $this->hasMany(Category::class, 'parent_category', 'id'); }Más tarde puede buscar las relaciones, por ejemplo, así:
$cat = Category::where('category_type', 'main')->first(); $cat->childCategories; //all the categories where the main category has been set as parent categoryO
$cat2 = Category::where('category_type', 'secondary')->first(); $cat2->parentCategory; //the category object which has been marked as parent for that specific secondary categorySi desea filtrar por tipo de categoría en las relaciones, también puede hacerlo:
public function superiorChildCategories() { return $this->hasMany(Category::class,'parent_category','id')->where('category_type','superior'); }Usar:
$cat3 = Category::where('category_type', 'main')->first(); $cat3->superiorChildCategories; //all the superior type categories where the main category has been set as parent category, will return null if there is no superior type child categories No olvide establecer también la relación de tipo principal real en la base de datos, por lo que la columna parent_category debe ser la identificación de la categoría principal.
También está probado y funciona como se esperaba.
Como sé, las relaciones de Laravel funcionan entre modelos y no dentro de un modelo. Le recomendaría usar modelos separados (y tablas separadas).
Si todas las demás categorías están en el mismo nivel y todas pertenecen a una categoría principal, puede crear un modelo para la categoría principal y todos los demás pueden tener un modelo.
public function parent_category() { return $this->hasMany(Category::class,'parent_category','id'); }