Relaciones de tablas
Para crear una relación con una tabla externa tendremos que escribir el siguiente dentro de la clase de la tabla en el método up()
// Para que asegurar que el dato siempre sea positivo
$table->unsignedBigInteger('user_id');
// Para crear llaves foraneas y unirse a la siguiente la tabla externa
$table->foreign('user_id')->references('id')->on('users');
Así quedaría el código:
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('user_id');
$table->string('title');
$table->foreign('user_id')->references('id')->on('users');
$table->timestamps();
});
}
Ahora nos toca refrescar las tablas, para eso vamos a utilizar el siguiente comando:
php artisan migrate:refresh --seed
💚 Si les sale este error:
Illuminate\Database\QueryException
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (SQL: drop table if exists `users`)
Tendrás que proceder poner en la tabla que estás creado una relación el siguiente código dentro del método down()
public function down()
{
// El siguiente código:
Schema::dropIfExists('posts');
Schema::dropIfExists('users');
}
😋 Este error sucede porque para crear de nuevo las tablas, Laravel necesita que primero se borre la tabla hijo antes de borrar la tabla padre. La tabla hijo en este caso sería posts perp como Laravel primero va ha leer la tabla padre debemos poner esta sentencia en esta tabla.
- rand($min, $max) → Es una función que genera aleatoriamente un número dentro de los dos parámetros que le damos.
En Laravel 8x, para crear semillas de datos que van ser ejecutados por php artisan migration, tenemos que escribir la sentencia así:
public function run()
{
\App\Models\User::factory(4)->create();
\App\Models\Post::factory(12)->create();
// factory(App\Models\User::class, 3)->create();
// factory(App\Models\Post::class, 12)->create();
}
💢 Recuerda que la configuración que hicimos con las migraciones solamente afectaron a la Database, no a nuestro modelo.
Tenemos que ir a los archivos de los modelos de las tablas y especificar que hicimos la relación entre esas tablas, vamos a su clase y creamos el siguiente método:
// User.php => Aquí dejaremos una sentencia que significa que
// un usuario tiene muchos posts
public function posts()
{
return $this->hasMany(Post::class);
}
// Post.php => Aquí dejaremos una sentencia que significa que
// un post le pertence a un usuario.
public function user()
{
return $this->belongsTo(User::class);
}
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?