【发布时间】:2025-12-17 11:00:02
【问题描述】:
我的应用程序中有这种情况,用户只能在每个版本中上传一个期刊(一个版本包含来自许多用户的许多期刊),但如果需要,用户还可以标记其他用户以授权他们作为期刊作者之一(如果用户尚未上传任何期刊,则被标记的用户仍然可以将期刊上传到与该用户被标记为作者的期刊相同的版本)。到目前为止,我设法做到了这一点,除了限制每个版本中可以上传的文件数量。以下是我的迁移:
版本表:
class CreateTableEdition extends Migration {
public function up() {
Schema::create('edition', function (Blueprint $table) {
$table->increments('id');
$table->integer('volume');
$table->text('cover')->nullable();
$table->integer('number');
$table->timestamps();
});
Schema::table('journal', function(Blueprint $table) {
$table->foreign('id_edition')->references('id')->on('edition')->onDelete('cascade')->onUpdate('cascade');
});
}
public function down() {
Schema::table('journal', function(Blueprint $table) {
$table->dropForeign('journal_id_edition_foreign');
});
Schema::drop('edition');
}
}
日志表:
class CreateTableJournal extends Migration {
public function up() {
Schema::create('journal', function (Blueprint $table) {
$table->increments('id');
$table->string('title', 255);
$table->text('abstract');
$table->text('file');
$table->integer('id_edition')->unsigned();
$table->integer('user_id')->unsigned();
$table->string('journalslug');
$table->timestamps();
});
Schema::table('journal', function(Blueprint $table) {
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
});
}
public function down() {
Schema::table('journal', function(Blueprint $table) {
$table->dropForeign('journal_user_id_foreign');
});
Schema::drop('journal');
}
}
用户表:
class CreateUsersTable extends Migration
{
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');
}
}
Penulis表(数据透视表连接users表和journal表)
public function up()
{
Schema::create('penulis', function (Blueprint $table) {
// Create tabel penulis
$table->integer('id_user')->unsigned()->index();
$table->integer('id_journal')->unsigned()->index();
$table->timestamps();
$table->primary(['id_user', 'id_journal']);
$table->foreign('id_user')
->references('id')
->on('users')
->onDelete('cascade')
->onUpdate('cascade');
$table->foreign('id_journal')
->references('id')
->on('journal')
->onDelete('cascade')
->onUpdate('cascade');
});
}
public function down()
{
Schema::drop('penulis');
}
}
-Edition表和Journal表是一对多的关系(一个版本可以有多个期刊)
-Users 表和Journal 表有多重关系,第一个是多对多关系,使用户可以将另一个用户标记为他/她要上传的期刊的作者之一。这种关系使用数据透视表(penulis table)连接起来。第二种是一对多关系(一个用户有很多期刊),使得上传期刊的用户是唯一可以修改或删除期刊的用户(标记用户不能)。
现在回到问题,如何使这成为可能?限制用户可以上传的文件数量,以便用户在每个版本中只能上传一个期刊。下面是我当前用来存储日志的控制器。
public function storejournal(JournalRequest $request) {
$input = $request->all();
$input['user_id'] = Auth::id();
//Input PDF
if ($request->hasFile('file')) {
$input['file'] = $this->uploadPDF($request);
}
$id = $request->id;
$journal = Edition::findOrFail($id)->journal()->create($input);
$journal->user()->attach($request->input('penulis'));
return redirect()->route('edition', ['id' => $id]);
}
如果有人可以提供帮助,那就太好了,谢谢你,并为我糟糕的英语感到抱歉。
【问题讨论】:
-
我同意提供详细问题很重要,但为了清楚起见,避免多余信息也同样重要。