У меня есть это, у пользователя есть свойство "многие ко многим" через pivot property_users.
Я делаю как-то повторно используемые классы в моем веб-приложении.
Это модели сих функции загрузки:
//User model
public function properties()
{
return $this->belongsToMany(Property::class, 'property_users', 'user_id', 'property_id');
}
//Property model
public function property_users()
{
return $this->hasMany(PropertyUser::class, 'property_id', 'id');
}
//PropertyUser model
public function user()
{
return $this->belongsTo(User::class);
}
//GetProperties class
public function handle()
{
return auth()->user()->properties()->get();
}
//somewhere in a feature
$properties = $this->run(GetProperties::class);
//this returns valid properties under the logged in user
Теперь мне нужно получить chat_username в property_users, принадлежащем этому пользователю
Мне удается заставить его работать, если я перебираю свойства и затем делаю этона лету.
$properties = $properties->map(function($property) {
$propertyUsers = $property->property_users()->get();
$chatUsername = null;
foreach($propertyUsers as $propertyUser) {
if($propertyUser->property_id == $property->id) {
$chatUsername = $propertyUser->chat_username;
}
}
return [
'name' => $property->name,
'id' => $property->id,
'chat_username' => $chatUsername
];
});
Но я пытаюсь уменьшить количество запросов в цикле, чтобы уменьшить попадания, особенно когда они находятся в нескольких свойствах в базе данных .
Другой способ заключается в том, что яможно добавить property_users в загружаемую загрузку в классе GetProperties, обновив его до:
$query = Property::query();
$query->with(['property_users']);
$query->whereHas('property_users', function($qry) {
$qry->where('user_id', Auth::user()->id);
});
$properties = $query->get();
return $properties;
Но я не хочу полагаться на добавление более загруженной загрузки в исходный класс GetProperties, поскольку GetProperties получитfat и мне эти данные на самом деле не нужны (скажем, добавление property_invoices, property_schedules и т. д., но в какой-то мере они не нужны).
Скорее, я хочу загружать на лету, нос изюминкой!Вот как я мог бы это представить:
Соберите все идентификаторы из свойств, выполните выборку, используя , где , и примените всех пользователей к свойствам в одном запросе.Таким образом, это будет еще красивее.
Может быть, что-то вроде этого: (используя оригинальный класс GetProperties)
$properties = $this->run(GetProperties::class);
//this does not work. The error is: Method Illuminate\Database\Eloquent\Collection::property_users does not exist.
$property->property_users = $properties->property_users()->get();
Было бы замечательно, если бы кто-то мог показать мне, как это сделать.