--- title: Laravel [03] (Relacions 1aN) tags: daw, Laravel, migrations, M7 --- <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licencia de Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a><br />Este obra está bajo una <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional</a>. [Enllaç a Hackmk.io](https://hackmd.io/@JdaXaviQ/H1m28_2-n) ## Laravel [03] (Relacions 1aN). ### Migracions amb relacions 1-N: Per aquest nou lliurament crearem un nou projecte, relacions1aN, però aprofitarem la base de dades __relacions__ que varem utilitzar amb les rel·lacions 1a1. ```bash= isard@ubuntu:~/src$ composer create-project laravel/laravel relacions1aN ``` ` Ens farem dues migracions noves una per a empleats i una altra per a projectes: ```basch= php artisan make:migration create_projectes_table php artisan make:migration create_empleats_table ``` Modifiquem els arxius resultants per a afegir els camps que necessitem: ```php= public function up() { Schema::create('projectes', function (Blueprint $table) { $table->id(); $table->string('nom_proj'); $table->float('preu', 10, 2); $table->timestamps(); }); } public function up() { Schema::create('empleats', function (Blueprint $table) { $table->id(); $table->string('nom_empl'); $table->string('cognom_empl'); $table->float('sou', 8, 2); $table->unsignedBigInteger('projecte_id'); $table->foreign('projecte_id')->references('id')->on('projectes'); $table->timestamps(); }); } ``` I podem procedir a migrar: ```bash= php artisan migrate INFO Running migrations. 2023_04_16_084400_create_projectes_table ...... 25ms DONE 2023_04_16_084406_create_empleats_table ....... 25ms DONE ``` Ara toca generar els models de les nostres taules: ```bash= php artisan make:model Empleat php artisan make:model Projecte ``` Com que en aquest cas la clau forana està a empleats, farem la rel·lació directa a la taula projectes, però enlloc d'utilitzar la funció 'hasOne()' farem servir la funció 'hasMany()': ```php= <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Projecte extends Model { use HasFactory; public function empleats() { return $this->hasMany(Empleat::class); } } ``` I la rel·laciól inversa al model Empleat: ```php= <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Empleat extends Model { use HasFactory; public function projecte() { return $this->belongsTo(Projecte::class); } } ``` Ara només queda modificar el fitxer de rutes __web.php__ com habiem fet amb les rel·lacions 1a1. ```php= <?php use Illuminate\Support\Facades\Route; use App\Models\Empleat; use App\Models\Projecte; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider and all of them will | be assigned to the "web" middleware group. Make something great! | */ Route::get('/', function () { return view('welcome'); }); Route::get('/projectes/{id}', function($id){ return Projecte::find($id); }); Route::get('/projectes/{id}/empleats', function($id){ return Projecte::find($id)->empleats; }); Route::get('/empleats/{id}', function($id){ return Empleat::find($id); }); Route::get('/empleats/{id}/projecte', function($id){ return Empleat::find($id)->projecte; }); ```