Не понимаю как сделать связь в модели с условием. Это можно?
Есть таблица с файлами. В ней хранятся и фото пользователей.
В модели user сделал связь с этой таблицей:
public function photo_user()
{
return $this->belongsTo('App\Models\File');
}
Но дело в том, что в этой таблице фото пользователя храниться и строке,
в которой поле module_id равно user_profile
Сейчас например:
User::find(2)->photo_user;
Выдает Null
Как вытащить фото с такими условиями?
public function photoUser(){
return $this->belongsTo('App\Models\File')->where('module_id', $this->user_profile);
}
public function getPhotoUserAttribute(){
return $this->photoUser()->first()->photo_user;
}
chelkaz: продебажьте с помощью функции dd();
Для начала dd($this->photoUser());
Потом dd($this->photoUser()->first());
Найдите нужный аттрибут, и переделайте под свои нужды.
Так же проверьте, правильно ли идет выборка ->where('module_id', $this->user_profile). Может, результатов попросту нет?
В таком случае напишите условный оператор вроде:
chelkaz: Потому что такие ключи генерирует Laravel. Почитайте документацию belongsTo, в вашем случае надо указать таблицу, связующий ключ, и ключ по которому будет идти выборка (в вашем случае user_id)
Я явно ведь указал как таблицу, так и ключ:
return $this->belongsTo('App\Models\File', 'user_id')
Но все ровно null
Имеет ли значение название функции? Я назвал функцию photoUser
Но сама фотография хранится в поле image_url таблицы files
Точно! До этого использовал hasOne
public function UserPhoto(){
return $this->hasOne('App\Models\File', 'user_id')->where('module_id', 'user_profile');
}
Но где то увидел в примере belongsTo и решил что нужно с ним. Вы не могли бы пример в двух словах, в каких случаях использовать belongsTo ?
belongsTo использует связующую таблицу.
На примере: Имеются таблицы news и category. У новости может быть одна категория. При использовании belongsTo создается так же связующая таблица (news_category) с полями news_id и category_id, через которую идет перелинковка.
belongsToMany работает по тому же принципу, но можно хранить к примеру несколько категорий у новости.
hasOne - имеется колонка category_id прямо в таблице новости, через нее идет связь напрямую к таблице category. Либо наоборот, таблица category имеет news_id
hasMany - по аналогии, к примеру у новости может быть много комментариев. В таблице comments у каждой записи есть news_id, означающий к какой новости комментарий относится.
morphOne - разные модели могут использовать одну и ту же таблицу, и хранить в ней данные. Разделяется по типу (обычно - namespace модели). Используется для хранения переводов, SEO, картинок, и т.д.
morpMany - по аналогии. Вместо одной записи дергает несколько.