在Laravel 5.5中存储相关数据的便捷方式

时间:2018-03-06 14:15:15

标签: laravel-5 laravel-eloquent

我有下一个数据结构:

有用户表用户。 每个用户可以有4种类型的文件。

是否可以将其保存在表格结构中:文件

id | user_id | type1 | type2 | type3 | type4

还可以使用类似下一个的代码吗?

$user->files($type, $value);

1 个答案:

答案 0 :(得分:1)

我以下一种方式解决此问题

<强> migration_file.php

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class ImplementFilesStorage extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->integer(['files_id'])->unsigned();
        });

        Schema::create('files', function (Blueprint $table) {
            $table->increments('id');
            $table->string('id_file')->nullable();
            $table->string('bill_file')->nullable();
            $table->string('card_back_file')->nullable();
            $table->string('card_front_file')->nullable();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('manager_files');
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn(['files_id']);
        });
    }
}

<强> user.php的

class User extends EloquentUser {
    protected $table = 'users';
    public function files()
    {
        return $this->hasOne('App\File', 'files_id');
    }
}

<强> File.php

class File extends Model
{
    protected $table = 'files';

    public function user()
    {
        return $this->belongsTo('App\User', 'files_id');
    }

    public function type($type, $filename = '')
    {
        $field_name = $type . '_file';
        if ($filename) {
            $this->{$field_name} = $filename;
        }

        return $this->{$field_name};
    }
}

现在,为了阅读价值观,我使用$user->files->type($type_name)进行写作 $user->files->type($type_name, $stored_value)

注意:在我们需要调用$user->files->save();的所有操作后保存文件表中的更改。

如果您有关于不方便使用ORM的通知,请通知我。

P.S:实际上我解决了相当困难的任务。可能稍后我会在我的博客上发布它并提供链接。