¡Esta es una revisión vieja del documento!
Relaciones entre modelos
Relaciones uno a uno
Por ejemplo, un pago pertenece a una orden y una orden tiene un único pago.
Para estas relaciones se necesitan claves foráneas.
El modelo que pertenece a otro es el que lleva la clave foránea. Para el ejemplo, anterior, un pago pertenece a una orden, así que será el pago quien lleve la clave foránea de la orden.
Por consistencia, se recomienda que la clave foránea se llame igual que el modelo relacionado seguido de _id.
Vamos la migración donde se crea un orden:
// code class createPaymentsTable extends Migration { public function up() { Schema::create("orders", function (Blueprint $table) { $table->id(); $table->float("amount")->unsigned(); $table->timestamp("payed_at")->nullable(); $table->bigInteger("order_id")->unsigned(); $table->timestamps(); // Establecemos la relación de la clave foránea con la clave // primaria de la tabla padre $table->foreign("order_id")->references("id")->on("orders"); }); } // code }
Ahora tenemos que relacionar a nivel de modelo las órdenes y los pagos. Vamos al model Order.php:
namespace App; use App\Model\Payment; use Illuminate\Database\Eloquent\Model; class Order extends Model { protected $fillable = ["status"]; public function payment() { // Una orden tiene un pago return $this->hasOne(Payment::class); } }
Ahora tenemos que ir al modelo Payment.php para poder decir que pertenece a una orden:
namespace App; use App\Models\Order; // code protected $fillable = [ "amount", "payed_at", "order_id" ]; public function order() { return $this->belongsTo(Order::class); }
Para hacer pruebas:
php artisan tinker
Creamos una orden:
$order = App\Models\Order::class->factory->create();
Creamos un pago asociado a la orden anterior:
$payment = App\Models\Order::class->factory->create(["order_id" => $order->id]);
