Laravel Eloquent: есть много или еще? - PullRequest
0 голосов
/ 03 декабря 2018

В Laravel 5.7 я прочитал документацию Has Many Through , но я все еще не могу правильно использовать ее для моего случая.

Вот БД:

Analytics

    id
    data
    subscriber_id

Subscribers

    id
    city_id

Cities

    id
    name

Мне нужна модель Analytics для получения данных из Analytics с subscribers.id и cities.name

Что я сделал:

Модели подключенной аналитики и подписчиков

<?php

class Analytics extends Model
{
    public function subscriber()
    {
        return $this->belongsTo('App\Models\Subscriber');
    }
}

class Subscriber extends Model
{
    public function analytics()
    {
        return $this->hasMany('App\Models\Analytics');
    }
}

Сделал запрос, который получает данные из таблицы Analytics с данными подписчиков:

$results = Analytics::where('survey_id', '4')
    ->with('subscriber')
    ->whereDate('created_at', '>=', $last_survey_date)
    ->orderBy('data')
    ->get();

Если у кого-нибудь есть идеи, как добраться до городаимена, поделитесь, пожалуйста.

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Я не уверен, правильно ли я понял ваш запрос.Вы хотите получить все 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.

0 голосов
/ 04 декабря 2018

Спасибо Ник Сурманидзе и Намошек за ваши ответы!Я нашел способ, которым это работает прошлой ночью:

class Subscriber extends Model
{
    public function analytics()
    {
        return $this->hasMany('App\Models\Analytics');
    }

    public function subscriberCity()
    {
        return $this->belongsTo('Modules\Directories\Entities\City', 'city_id', 'id');
    }

}


class City extends Model
{
    public function subscriber()
    {
        return $this->hasMany('App\Models\Subscriber');
    }
}

И нужный результат можно получить следующим образом:

$results = Analytics::where('survey_id', '4')
    ->with(['subscriber' => function($i){
            $i->with(['subscriberCity']);
        }])
    ->whereDate('created_at', '>=', $last_survey_date)
    ->orderBy('data')
    ->get();
0 голосов
/ 03 декабря 2018
  // maybe this will work for you?
  class Analytics extends Model
    {
        public function subscriber()
        {
            return $this->belongsTo('App\Models\Subscriber');
        }

        public function cities() {
            return $this->hasManyThrough('App\City', 'App\Subscriber');
        }   

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...