Отношения в Laravel, нюанс с названием отношений, как сделать корректно?
Добрый день.
Знатоки Лары, подскажите пожалуйста один нюанс.
Например, мы можем использовать отношения вида:
$user->posts() (с получением query builder и дальнейшей работой с запросом)
или же
$user->posts (без скобок, сразу все items без query builder)
Однако, заметил, что если в названии отношения указать два слова, например blogPosts вместо posts,
то не получается вызвать $user->blogPosts. значение будет пустое.
Приходится использовать $user->blogPosts()->get()
Вопрос, как вызвать отношение вида "blogPosts" (из двух слов в названии), чтобы не использовать query builder ?
Хотя, вроде, я ошибаюсь. Мы уже много лет переопределяем получение отношений, чтобы оно совпадало с атрибутами, которые в snake_case. Или это уже сделали дефолтом... Короче, не помню уже как в ванильной версии.
Но точно должно работать или blog_posts, или blogPosts, в одном случае должен возвращаться null (это когда неправильный формат), а в другом коллекция, как при blogPosts()->get().
Данная проблемка создает косметический дефект в коде, если приходится писать название отношения в виде public function blog_posts(), хотя даже в самой доке не используется snake case https://laravel.su/docs/8.x/eloquent-relationships
Видимо, это всё таки некая глобальная проблема, насколько я понял.
Это не "глобальная проблема", а просто кривой в понимании многих людей дизайн: колонки в БД и мутаторы атрибутов в snake_case, а отношения в camelCase. Для выправления этой кривизны я и использую переопределение поведения, о котором выше написал.
Однако, это не имеет никакого отношения к тому, что у вас $user->blogPosts возвращает null - это не нормальное поведение.