我在我的應用程序中有這種情況,我必須限制可以由用戶編寫的帖子。例如,我有一個名爲Edition的表來存儲版本數據和Article表來存儲文章數據。版表和文章表有一對多的關係(一版有很多文章)。現在,我有一個Users表來存儲用戶數據,並且這個表與Article表有一對多的關係(一個用戶有很多文章)。切入案例,我想制定一個規則,用戶每個版本只能有一篇文章。我們只是說有一個名爲「日本食品」的版本記錄,在這個版本的記錄中,用戶可以發佈他們的文章,但只有一篇文章。已經在這個「日本食品」版中發佈他們的文章的用戶將只能夠在他們還沒有發佈任何文章的另一版本記錄中發佈新文章。現在我的問題是,如何在Laravel制定這樣的規則?特別是Laravel 5.3。我創建了我的遷移和模型,下面是代碼(以防需要幫助您回答我的問題)。限制單個記錄中的用戶帖子
版表:
public function up() {
Schema::create('edition', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->integer('volume');
$table->text('cover')->nullable();
$table->integer('number');
$table->timestamps();
});
Schema::table('article', function(Blueprint $table) {
$table->foreign('id_edition')->references('id')->on('edition')->onDelete('cascade')->onUpdate('cascade');
});
}
public function down() {
Schema::table('article', function(Blueprint $table) {
$table->dropForeign('article_id_edition_foreign');
});
Schema::drop('edition');
}
文章表:
public function up() {
Schema::create('article', function (Blueprint $table) {
$table->increments('id');
$table->string('title', 255);
$table->text('content');
$table->text('file');
$table->integer('id_edition')->unsigned();
$table->integer('user_id')->unsigned();
$table->string('articleslug');
$table->enum('publish', ['yes', 'no']);
$table->timestamps();
});
Schema::table('article', function(Blueprint $table) {
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
});
}
public function down() {
Schema::table('article', function(Blueprint $table) {
$table->dropForeign('article_user_id_foreign');
});
Schema::drop('article');
}
用戶表:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('username')->unique();
$table->string('userslug');
$table->string('nameslug');
$table->string('email')->unique();
$table->string('phone')->nullable();
$table->string('address')->nullable();
$table->string('password');
$table->rememberToken();
$table->enum('level', ['admin', 'author']);
$table->timestamps();
});
}
public function down()
{
Schema::drop('users');
}
我的控制器:
public function storeArticle(ArticleRequest $request) {
$input = $request->all();
$input['user_id'] = Auth::id();
$idi = $request->id;
$id_edition = Edition::findOrfail($idi);
$user = Auth::user();
if ($this->userPolicy->userHasArticle($user, $id_edition)) {
//Input PDF
if ($request->hasFile('file')) {
$input['file'] = $this->uploadPDF($request);
}
//Insert article datas
$article = Edition::findOrFail($idi)->article()->create($input);
$article->user()->attach($request->input('penulis'));
return redirect()->route('edition', ['id' => $idi]);
} else {
return 'Error! You already posted your article in this edition, please pick another edition instead';
}
}
謝謝你的幫助! :)
只是做一個UserPolicy並創建一個方法檢查他是否已經發布文章。第二個解決方案是你可以使用獨特的驗證規則。有關用戶策略的更多信息,請查看laravel的授權5.3 @AriandoMiller – PassionInfinite
我知道我可以使用policy和gate來做到這一點,但是我的問題是邏輯看起來像@PassionInfinite –
hey @PassionInfinite你還在嗎?我今天才意識到這不起作用,即使用戶還沒有發佈任何文章,但它仍然返回錯誤消息 –