Laravel глубокий запрос - PullRequest
       2

Laravel глубокий запрос

0 голосов
/ 14 апреля 2020

Мне нужно привести мои модели в глубокие взаимосвязи, но он возвращает

SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1055 Выражение № 5 списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец gis-web.areas.id, который функционально не зависит от столбцов в предложении GROUP BY; это несовместимо с sql_mode = only_full_group_by (SQL: выберите zone_regions. , areas. , segments. * из zone_regions внутреннее соединение areas в areas. zone_id = zone_regions. id внутреннее объединение hthree_regions в hthree_regions. area_id = areas. id внутреннее объединение segments в segments. hthree_id = hthree_regions. id группировка по zone_regions. id)

код

$data = DB::table('zone_regions')
        ->join('areas', 'areas.zone_id', '=', 'zone_regions.id')
        ->join('hthree_regions', 'hthree_regions.area_id', '=', 'areas.id')
        ->join('segments', 'segments.hthree_id', '=', 'hthree_regions.id')
        ->select(
            'zone_regions.*',
            'areas.*',
            'segments.*'
        )
        ->groupBy('zone_regions.id')
        ->get();

Logi c

  1. zone_regions имеет areas
  2. areas имеет hthree_regions
  3. hthree_regions имеет segments
  4. и так далее, я добавлю ...

что я хочу получить из этих данных?

Мне нужно получить zone_regions количество всего, что находится под ним, например:

zone_regions 1 имеет 20 areas, 2000 hthree_regions и 16000 segments

Так что я могу подсчитать все связанные строки с этим zone region, вот чего я пытаюсь достичь.

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 14 апреля 2020

В соответствии с вашей ошибкой проблема с вашей БД, он говорит, что у вас есть включить

sql_mode=only_full_group_by

Чтобы отключить этот режим с помощью

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

Для более подробную информацию вы можете просмотреть в этой документации https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

Несмотря на это, я вижу, что ваш запрос не получает того, что вам нужно, вам нужна агрегатная функция, такая как count, некоторые вроде.

data = DB::table('zone_regions') ->join('areas', 'areas.zone_id', '=', 'zone_regions.id') ->join('hthree_regions', 'hthree_regions.area_id', '=', 'areas.id') ->join('segments', 'segments.hthree_id', '=', 'hthree_regions.id') ->select( 'zone_regions.id' , DB::raw(' SUM(case when areas.id IS NOT NULL then 1 else 0 end) as areas,  SUM(case when hthree_regions.id.id IS NOT NULL then 1 else 0 end) as hthree_regions), SUM(case when segments.id IS NOT NULL then 1 else 0 end) as segments')->groupBy('zone_regions.id') ->get();

Я надеюсь помочь вам

0 голосов
/ 14 апреля 2020

РЕШЕНО

Поскольку я много боролся с подходом к запросу, я решил использовать функцию привязки модели hasManyThrough source

Я определил 3 новые функции в моей модели и вызвал их в моей переменной (с) теперь у меня есть желаемые данные.

Код

Model

class ZoneRegion extends Model
{
    protected $fillable = [
        'name',
    ];

    public function areas(){
        return $this->hasMany(Area::class, 'zone_id', 'id');
    }

    public function segments()
    {
        return $this->hasManyThrough(Segment::class, HthreeRegion::class, 'area_id', 'hthree_id');
    }

    public function links()
    {
        return $this->hasManyThrough(Link::class, Segment::class, 'hthree_id', 'segment_id');
    }

    public function cabels()
    {
        return $this->hasManyThrough(CableType::class, Link::class, 'cable_id', 'id');
    }
}

Controller

$zones = ZoneRegion::orderby('id', 'desc')->with(['areas', 'segments', 'links', 'cabels'])->get();

И это делает свое дело, теперь все, что мне нужно сделать, это получить length моих данных (JS подход) или count() моих данных (Blade подход)

Надеюсь, что это может помочь и другим.

0 голосов
/ 14 апреля 2020

Это потому, что "Строгий режим" не выключен на вашем Laravel.

Решение:

  1. Открыть yourproject/config/database.php
  2. Найти strict => true (изменить на false)

Не забудьте запустить php artisan config:cache

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