Отображение изображения профиля по умолчанию в Laravel

#php #laravel

#php #laravel

Вопрос:

Пользователи в моем приложении Laravel имеют столбец profile_image в своей модели / внутри базы данных. Для него можно установить любое изображение, которое им нравится, если они являются зарегистрированными пользователями, но я столкнулся с проблемой, что для изображения их профиля не задано изображение, поэтому при попытке зарегистрировать нового пользователя выдается ошибка.

SQLSTATE[HY000]: Общая ошибка: 1364 Поле ‘profile_image’ не имеет значения по умолчанию (SQL: вставить в users ( name , email , password , updated_at , created_at ) значения

Я попытался использовать это, чтобы проверить, является ли поле нулевым, чтобы оно возвращало путь к используемому изображению по умолчанию. В противном случае оно должно возвращать значение profile_image пользователя.

 public function profileImage()
{
    if (is_null($this->profile_image)){
        $imagePath = 'defaultavatar.png';
    } else {
        $imagePath = $this->profile_image;
    }

    return '/storage/avatars/' . $imagePath;
}
 

И, конечно, это используется в файле блейда в профиле пользователя.

 <img src="{{ Auth::user()->profileImage() }}" class="img-fluid rounded-circle shadow-sm" height="150px" width="150px">
 

Похоже, это не работает. Это просто выдает указанную выше ошибку sqlstate.

Ответ №1:

Возможно, вы сможете использовать шаблон Null Object

https://laravel.com/docs/8.x/eloquent-relationships#default-models

итак, вы могли бы сделать что-то вроде этого

 public function profile() {
 return $this->belongsTo(Profile::class)
    ->withDefault([
         'image_path' => 'path to default image'
    ]);
}
 

Таким образом, вы в безопасности и всегда возвращаете объект профиля.

Ответ №2:

Вы можете сделать profile_image столбец в базе данных обнуляемым, чтобы избавиться от ошибки, или вы можете ввести значение по умолчанию для profile_image столбца. Существует два варианта заполнения изображения профиля значением по умолчанию.

Вариант 1: (обработка на уровне базы данных)

Установите значение по умолчанию для profile_image столбца в файле миграции равным /storage/avatars/defaultavatar.png

 

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->timestamp('email_verified_at')->nullable();
            $table->string('profile_image')->default('/storage/avatars/defaultavatar.png')
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}
 

Вариант 2: (дескриптор в контроллере)

Когда POST-запрос с данными для регистрации нового пользователя поступает в контроллер, проверьте, имеет ли profile_image значение, если не заполняется значением по умолчанию

     protected funtion profileImagePath()
    {
        $path = '/storage/avatars/defaultavatar.png';
        if(request()->hasFile('profile_image') amp;amp; request()->file('profile_image')->isValid()) {
            $path = request()->profile_image->store('avatars');
        }
        
        return $path;
    }

//$data is validated Request data received via registration form

/**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return AppUser
     */
    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
            'profile_image' => $this->profileImagePath(),
        ]);
    }
 

Комментарии:

1. Я пошел дальше и сделал это на уровне базы данных, но спасибо, что дали мне знать, как проверить, является ли столбец null или нет. Это работает!