Laravel ファイルアップロードから表示までの書き方

OneToOneの画像用のモデル・migrationファイルを作成し、belongsToでUserからつなげる。ここまでは、他のOneToOneと同じ。
画像は、Controllerで、ファイル名をDBに保存し、画像自体は/images/フォルダに格納。
呼び出しはAccessorを使って、$user->photo->fileでimgタグに埋め込む。

$ php artisan make:migration add_photo_id_to_users –table=users

migration file

public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            //
            $table->string('photo_id');
        });
    }
public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            //
            $table->dropColumn('photo_id');
        });
    }

$ php artisan migrate

AdminUsersController.php

public function store(UsersRequest $request)
    {
        User::create($request->all());

        return redirect('/admin/users');
        // return $request->all();
    }

User.php

protected $fillable = [
        'name', 'email', 'password','role_id', 'is_active',
    ];

$ php artisan make:model Photo -m

$ git add .
$ git commit -m “user able to persits”

photo migration file

Schema::create('photos', function (Blueprint $table) {
            $table->increments('id');
            $table->string('file');
            $table->timestamps();
        });

Model: Photo.php

class Photo extends Model
{
    protected $fillable = ['file'];    
}

Model: User.php

public function photo(){
        return $this->belongsTo('App\Photo');
    }

$ php artisan migrate

$ php artisan route:list;

View: admin.blade.php
リンクはrouteのname sapaceを使う

<li>
                                <a href="{{route('admin.users.index')}}">All Users</a>
                            </li>

                            <li>
                                <a href="{{route('admin.users.create')}}">Create User</a>
                            </li>

AdminUsersController.php

public function store(UsersRequest $request)
    {
        // User::create($request->all());
        $input = $request->all();

        if($file = $request->file('photo_id')){
            $name = time(). $file->getClientOriginalName();

            $file->move('images', $name);

            $photo = Photo::create(['file'=>$name]);

            $input['photo_id']  = $photo->id;
        }

        $input['password'] = bcrypt($request->password);

        User::create($input);

        // return redirect('/admin/users');
        // return $request->all();
    }

Model:Photo.php

protected $upload = 'images/';
    protected $fillable = ['file'];

    public function getFileAttribute($photo){
    		return $this->upload . $photo;
    }

View: users/index.blade.php

<tbody>
		@if($users)
			@foreach($users as $user)
			<tr>
			  <td>{{$user->id}}</td>
			  <td><img height="50" src="/images/{{$user->photo ? $user->photo->file : ''}}"></td>
			  <td>{{$user->name}}</td>
			  <td>{{$user->email}}</td>
			  <td>{{$user->role->name}}</td>
			  <td>{{$user->is_active == 1 ? 'Active' : 'No Active'}}</td>
			  <td>{{$user->created_at->diffForHumans()}}</td>
			  <td>{{$user->updated_at->diffForHumans()}}</td>
			</tr>
			@endforeach
		@endif
		</tbody>

ここでは画像はpublicのimagesフォルダ配下を想定しているが、S3の場合は、ControllerでS3にmoveと書く必要がある。その場合もViewでS3から呼び出せばよい。画像フォルダの格納ロジックは別途考える必要がある。例えば、/images/${userId}/${imageName}とするかなど。