【发布时间】:2016-11-22 23:56:07
【问题描述】:
我的应用程序中有这种情况,我必须限制用户可以编写的帖子。例如,我有一个名为 Edition 的表来存储版本数据和一个 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
-
嘿@PassionInfinite 你还在吗?我今天才意识到这不起作用,即使用户尚未在给定版本中发布任何文章,它也会不断返回错误消息
-
@PassionInfinite 我已经用控制器更新了我的问题。抱歉,我无法加载讨论,我的连接现在超级慢
-
对不起,你是什么意思?@PassionInfinite