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