블로그 방치

새로운 회사에 입사후 지금까지 블로그를 거의 방치해 놓았다.

가끔 기술 관련된 글도 올리고 해야 하는데 여유가 별로 없었던 듯... ㅡ,.ㅡ

얼마전에 Laravel 6.0 LTS도 출시되었는데 업데이트도 하고 기능 추가도 할 겸 블로그 손도 봐야 할 것 같다.

Blog Life Laravel

Mutators 사용 시 "laravel Trying to get property 'name' of non-object" 에러 해결법

Laravel Mutators를 이용하여 Relationships 관계에 있는 컬럼의 값을 포함하고자 하는 경우 getAttribute() Magic 메서드로 포함하고자 할 컬럼을 지정해주고 $appends 프로퍼티에 명시하여야 한다.

다음 코드는 Post 모델에 Category 모델의 name 컬럼을 Post 모델의 category_name 프로퍼티로 포함하는 예제이다.

class Post extends Model
{
    protected $appends = [
        'category_name',
    ];

    public function category()
    {
        return $this->belongsTo(Category::class);
    }

    public function getCategoryNameAttribute()
    {
        return $this->category->name;
    }

}

하지만, 중간중간 해당하는 Category 모델이 없는 경우 (카테고리가 삭제 된 경우) "laravel Trying to get property 'name' of non-object" 에러가 발생한다.

당연히 해당 모델이 없기 때문에 $this->category는 null이 되고,  $this->user->name 프로퍼티에 접근할 수 없기 때문에 발생하는 문제이다.

이럴 경우 다음과 같이 null 여부를 체크하면 된다.

public function getCategoryNameAttribute()
{
    return $this->user !== null ? $this->user->name : null;
}

뿐만 아니라, 개발에 있어서 이와 같은 방어적 코딩을 습관화 하는 것이 좋다.

Develop Laravel Mutators Troubleshooting

MariaDB에서 artisan migrate 시 Syntax Error 문제 해결 방법

Laravel에서 artisan migrate 명령을 실행 시 MariaDB에서는 다음과 같은 에러가 발생하는 경우가 있다.

[Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table users add unique users_email_unique(email))

[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

이럴 경우 AppServiceProvider.php의 boot() 메서드에 다음 구문을 추가하여 해결할 수 있다.

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

 

Laravel migrate MariaDB Troubleshooting