#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 или нет. Это работает!