Tvorjenje relacij med tabelami v Laravel


Spodaj je primer implementacije 1:M in N:M relacij. Laravel sicer pozna še dve vrsti relacij – 1:1 in polimorfna povezava. Izbral sem si primer bloga, kjer ima uporabnik lahko več zapisov, zapis pa pripada uporabniku. Zapis ima lahko več kategorij, v eni kategoriji pa je lahko več zapisov. Ko to enkrat osvojiš, vidiš da je kreiranje relacij z Laravelom peace of cake.

/app/database/migrations/2013_12_08_183527_create_tables.php
[code type=”php”]increments(‘id’);
$table->string(‘username’);
$table->string(‘password’);
$table->string(’email’);
$table->timestamps();
});

Schema::create(‘posts’, function(Blueprint $table)
{
$table->increments(‘id’);
$table->string(‘title’);
$table->text(‘content’);
$table->integer(‘user_id’)->unsigned();
$table->foreign(‘user_id’)->references(‘id’)->on(‘users’);
$table->timestamps();
});

Schema::create(‘categories’, function(Blueprint $table)
{
$table->increments(‘id’);
$table->string(‘name’);
$table->timestamps();
});

Schema::create(‘category_post’, function(Blueprint $table)
{
$table->integer(‘post_id’)->unsigned();
$table->foreign(‘post_id’)->references(‘id’)->on(‘posts’);
$table->integer(‘category_id’)->unsigned();
$table->foreign(‘category_id’)->references(‘id’)->on(‘categories’);
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop(‘users’);
Schema::drop(‘posts’);
Schema::drop(‘categories’);
Schema::drop(‘category_post’);
}

}
[/code]

/app/database/seeds/TablesSeeder.php (po kreiranju je potrebno še dodati klic razreda v DatabaseSeeder.php)
[code type=”php”]insert([
[‘username’ => ‘jernej’, ’email’ => ‘jernej@example.com’, ‘password’ => ‘jernej_password’],
[‘username’ => ‘matej’, ’email’ => ‘matej@example.com’, ‘password’ => ‘matej_password’],
[‘username’ => ‘marko’, ’email’ => ‘marko@example.com’, ‘password’ => ‘marko_password’],
]);

DB::table(‘posts’)->insert([
[‘title’ => ‘Post title 1’, ‘content’ => ‘Post content 1’, ‘user_id’ => ‘1’],
[‘title’ => ‘Post title 2’, ‘content’ => ‘Post content 2’, ‘user_id’ => ‘1’],
[‘title’ => ‘Post title 3’, ‘content’ => ‘Post content 3’, ‘user_id’ => ‘2’],
[‘title’ => ‘Post title 4’, ‘content’ => ‘Post content 4’, ‘user_id’ => ‘3’]
]);

DB::table(‘categories’)->insert([
[‘name’ => ‘web development’],
[‘name’ => ‘javascript’],
[‘name’ => ‘python’]
]);

DB::table(‘category_post’)->insert([
[‘post_id’ => 1, ‘category_id’ => 1],
[‘post_id’ => 2, ‘category_id’ => 2],
[‘post_id’ => 3, ‘category_id’ => 3],
[‘post_id’ => 1, ‘category_id’ => 2],
[‘post_id’ => 3, ‘category_id’ => 3],
[‘post_id’ => 4, ‘category_id’ => 3],
]);
}

}[/code]

/app/models/Post.php
[code type=”php”]belongsTo(‘User’, ‘user_id’);
}

public function categories()
{
return $this->belongsToMany(‘Category’);
}
}
[/code]

/app/models/User.php
[code type=”php”]hasMany(‘Post’);
}

}[/code]

/app/models/Category.php
[code type=”php”]belongsToMany(‘Post’);
}
}[/code]

/app/routes.php
[code type=”php”]posts;
});

Route::get(‘posts’, function()
{
return Post::all();
});

Route::get(‘users’, function()
{
return User::all();
});

Route::get(‘posts/{id}/author’, function($id)
{
// get author of a post with given id
return Post::find($id)->author;
});

Route::get(‘posts/{id}/categories’, function($id)
{
return Post::find($id)->categories;
});

Route::get(‘categories/{id}/posts’, function($id)
{
return Category::find($id)->posts;
});

Route::get(‘users/{id}/posts/new’, function($id)
{
$user = User::find($id);

$post = new Post;
$post->title = Input::get(‘title’);
$post->content = Input::get(‘content’);

// $user->posts()->save($post);
// same achievement as last line (database-wise)
// $post->author()->associate($user);
// $post->save();

return $post;
});
[/code]