限制用户可以上传的文件数(Laravel 5.3)

时间:2016-11-16 13:46:18

标签: laravel laravel-5

我在我的应用程序中有这个场景,用户只能在每个版本中上传一个日志(一个版本包含来自许多用户的许多日志)但是用户还可以标记其他用户,以便在需要时授权他们作为期刊作者之一(如果用户尚未上传任何日志,则已标记的用户仍然可以将日记上载到具有用户被标记为作者的日志的同一版本)。到目前为止,我设法实现这一目标,除了限制每个版本中可以上传的文件数量。以下是我的迁移:

版表:

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表(用于连接用户表和日志表的数据透视表)

    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 table和Journal table有一对多的关系(一个版本可以有很多期刊)

-Users表和Journal表有多个关系,第一个是多对多关系,使用户能够将另一个用户标记为他/她要上传的期刊的作者之一。这种关系使用数据透视表(penulis表)连接。第二个是一对多关系(一个用户有很多期刊),以使上传期刊的用户成为唯一可以修改或删除期刊的人(标记用户不能)。

现在回到问题,如何使这成为可能?限制用户可以上传的文件数,以便用户只能在每个版本中上传一个日记。以下是我目前存储期刊的控制器。

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]);
}

如果有人可以提供帮助,那就太棒了,谢谢你,并为我可怕的英语道歉。

1 个答案:

答案 0 :(得分:0)

您可以将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]);
}