Я не уверен, правильно ли я понял ваш запрос.Вы хотите получить все Analytics
из Subscribers
данного City
?Или вы хотите название города подписчика аналитики?В любом случае, здесь есть оба решения.
Чтобы получить всю аналитику для подписчиков данного города:
$city = 'Vienna';
$results = Analytics::query()
->with('subscriber')
->whereHas('subscriber', function ($query) use ($city) {
$query->whereHas('city', function ($query) use ($city) {
$query->where('name', $city);
});
})
->where('survey_id', '4')
->whereDate('created_at', '>=', $last_survey_date)
->orderBy('data')
->get();
Или получить название города для записи аналитики, у вас есть два варианта.Один из них - использовать готовую загрузку Laravel для отношений, которая работает, но, вероятно, загрузит много ненужных данных в память:
$results = Analytics::query()
->with('subscriber.city') // you can nest relationships as far as they go
->where('survey_id', '4')
->whereDate('created_at', '>=', $last_survey_date)
->orderBy('data')
->get();
foreach ($results as $analytics) {
$city = $analytics->subscriber->city->name;
}
Другой - присоединиться к таблицам самостоятельно и выбрать только необходимые данные:
$results = Analytics::query()
->join('subscribers', 'subscribers.id', '=', 'analytics.subscriber_id')
->join('cities', 'cities.id', '=', 'subscribers.city_id')
->where('analytics.survey_id', '4')
->whereDate('analytics.created_at', '>=', $last_survey_date)
->orderBy('analytics.data')
->select('analytics.*', 'cities.name as city_name')
->get();
foreach ($results as $analytics) {
$city = $analytics->city_name;
}
Остерегайтесь, что вы можете использовать select('analytics.*', 'cities.name')
, но это переопределит столбец name
, выбранный из таблицы analytics
, если он существует.Поэтому лучше использовать псевдоним столбца с as col_alias
.