【问题标题】:Limit number of files that can be uploaded by user (Laravel 5.3)限制用户可以上传的文件数(Laravel 5.3)
【发布时间】: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]);
}

如果有人可以提供帮助,那就太好了,谢谢你,并为我糟糕的英语感到抱歉。

【问题讨论】:

  • 我同意提供详细问题很重要,但为了清楚起见,避免多余信息也同样重要。

标签: laravel laravel-5


【解决方案1】:

您可以将 Laravel Form Request ValidatorExists 一起使用(未测试)

首先,这样创建表单请求:

php artisan make:request JournalUserFormRequest

然后编辑检查id_journalid_user的组合是否已经存在:

//JournalUserFormRequest
public function rules()
{
 $user = Auth::user();
 $edition = Edition::findOrFail($request->id)
    return [
        'id_journal' => [
            'required',
            Rule::exists('journal')->where(function ($query) {
                $query->where('id_user', $user->id)
                      ->where('id_edition', $edition->id);
            }),
        ],
    ]
}

然后您可以获取经过验证的请求并将其存储。

public function storejournal(JournalUserFormRequest $request) {

    $id = $request->id;
    $journal = Edition::findOrFail($id)->journal()->create($input);
    $journal->user()->attach($request->input('penulis'));

    return redirect()->route('edition', ['id' => $id]);
}

【讨论】:

  • 还没有尝试过您的解决方案,但这似乎与版本无关。我想要的是用户在每个版本中只能上传一个期刊,并不意味着用户将不再能够上传新期刊。如果添加了新版本,用户将能够在新版本中上传新期刊。我一直在想也许我应该在 users 表和 edition 表之间创建一对一的关系,但我再次对 store 方法和验证感到困惑
  • @AriandoMiller。我不清楚。原理保持不变。我已经进行了编辑。在这里,我建议您通过确保给定的期刊用户版本记录在存储之前不存在来验证您的输入。您的问题很长,对问题进行更好的总结可以提高答案的质量和数量。
  • 那一定是因为我的英文XD。好的,我明白了,所以我不必在 users 表和 edition 表之间创建关系?我现在就试试这个
  • 我只是想具体一点,这就是为什么这个问题这么长,我可以写一本关于它的书,哈哈。我正在尝试您的解决方案,brb