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}とするかなど。