Laravel, uno de los frameworks PHP más populares, tiene varias funciones que lo hacen llamativo para los desarrolladores, siendo una de ellas hasOne, que básicamente permite la comunicación o relación entre dos tablas. Su nombre significa “crear la relación uno a uno”.
Previo la explicación de cómo usar esta útil relación de Laravel, definamos en qué consiste este framework y lo que puede lograr. Entre los beneficios que ofrece Laravel para desarrollar aplicaciones en PHP, se destacan la facilidad para el desarrollo, ya que integra herramientas BackEnd.
También, combinando los mejores paquetes en el ecosistema PHP, ofrece como resultado un framework robusto y amigable para los desarrolladores. Tiene la capacidad de crear sitios dinámicos con un innovador motor de plantillas, además de ofrecer al desarrollador un proceso de migración muy seguro y a prueba de balas.
Laravel cuenta con bibliotecas preinstaladas y orientadas a objetivos y utiliza una unidad de PHP con la que automatiza las pruebas de código al desarrollar aplicaciones web.
De entrada, podemos explicar un ejemplo sencillo del uso de hasOne: si un artículo tiene comentarios y queremos tomar uno de ellos con los detalles del artículo, podemos utilizar la relación hasOne o un usuario puede tener una tabla de perfil.
Cabe destacar que las relaciones Laravel no crean conexiones en la base de datos, estas relaciones son creadas en la capa de la aplicación y esto produce el resultado final. La relación hasOne acepta tres parámetros: nombre del modelo, foreign_key y la tercera, opcional, es local_key.
Esta es la sintaxis:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Owner extends Model { public function child() { return $this->hasOne(child::class,'foreign_key','local_key'); } }
En la sintaxis anterior, hemos utilizado el método belongsTo con 3 parámetros, por lo que aquí Child::class es el nombre del modelo que queremos relacionar, Foreign_key significa el nombre de la columna de la tabla secundaria y local_key significa el nombre de la columna de la tabla propia.
Laravel por si solo no es capaz de crear una consulta de unión interna, por lo que la hace de manera separada y luego junta los datos, usándolo de la siguiente manera:
Article::with('child')->get();
Esta línea de comando permitirá tener de regreso todos los artículos junto al primer comentario.
Modelo de artículo:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Article extends Model { use HasFactory; }
Modelo de comentario:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Comment extends Model { use HasFactory; }
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Article extends Model { use HasFactory; public function comment(){ return $this->hasOne(Comment::class); } }
En el código, se creó un comentario de método y se utilizó hasOne para la relación con el modelo de comentario. Al hacer esto, Laravel asume que el nombre de la tabla es comentario y la clave externa es la tabla article_id.
Vamos a crear un controlador e importar las clases necesarias para acceder al modelo y sus relaciones:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Article; class ArticleController extends Controller { public function index(Request $request) { $article=Article::with("comment")->first(); dump($article); dump($article->comment); } }
Por último, crea la ruta en web.php
Route::get('/articles',[ArticleController::class, 'index']);
Esto es un ejemplo de cómo usar la relación hasOne en un Proyecto Laravel, ideal para hacer el trabajo del desarrollador más rápido y sencillo, pudiendo crear un puente de comunicación o relación entre dos tablas de datos.