Можно ли получить полноценную orm-структуру моделей через множественный JOIN?

Привет участники!

Возникла задача сделать сортировку по связанным моделям. Покопал интернет и пришел к выводу, что надо делать join.
Написал такую портянку:

$document = Document::select('documents.*', 'c.*', 't.*')
            ->join('document_customs as c', 'documents.id', '=', 'c.document_id')
            ->join('document_templates as t', function($query){
                $query->on('t.document_type_id', '=', 'documents.type_id');
                $query->on('t.field_code', '=', 'c.field_code');
            })
            ->where('documents.id', '=', $document->id)
            ->orderBy('t.field_order', 'DESC')
            ->get();

        dd($document);


В итоге я получил коллекцию объектов типа Document
Collection {#784 ▼
  #items: array:15 [▼
    0 => Document {#785 ▶}
    1 => Document {#786 ▶}
    2 => Document {#787 ▶}
    3 => Document {#788 ▶}
    4 => Document {#789 ▶}
    5 => Document {#790 ▶}
    6 => Document {#791 ▶}
    7 => Document {#792 ▶}
    8 => Document {#793 ▶}
    9 => Document {#794 ▶}
    10 => Document {#795 ▶}
    11 => Document {#796 ▶}
    12 => Document {#797 ▶}
    13 => Document {#798 ▶}
    14 => Document {#799 ▶}
  ]
}

где в объекты типа Document были тупо напиханы все значения из выборки:
#attributes: array:21 [▼
        "id" => 7
        "active" => 1
        "number" => "С140ХТ1501111"
        "name" => "Новый документ1111"
        "start_date" => "2019-11-08 00:00:00"
        "end_date" => "2019-11-30 00:00:00"
        "type_id" => 4
        "status_id" => 1
        "author_id" => 5
        "workflow_id" => null
        "workflow_point_id" => null
        "approval_user_id" => null
        "created_at" => null
        "updated_at" => null
        "deleted_at" => null
        "document_id" => 7
        "field_code" => "radio"
        "field_value" => "{"10": "Десять", "20": "Двадцать", "30": "Тридцать"}"
        "document_type_id" => 4
        "field_order" => 55
        "model" => null
      ]


Короче говоря, я в печали. Мне нужно сделать сортировку связанных моделей, зависящих друг от друга, но в итоге получается, что ORM не умеет это делать.

Как тут решить задачу?
  • Вопрос задан
  • 519 просмотров
Пригласить эксперта
Ответы на вопрос 4
@vism
Сделайте не
Document::select('documents.*', 'c.*', 't.*')
а
Document::select('documents.*'')
и
->groupBy('documents.id')

другого варианта насколько я знаю нет.
Ответ написан
@pavelpolitaev
Вот вам сортировка по связанным моделям

Document::with(['document_customs', 'document_templates'])
            ->withCount(['document_templates as for_sort' => function ($q) {
                $q->select('field_order');
            }])
            ->where('id', '=', $document->id)
            ->orderBy('for_sort', 'DESC')
            ->get();
Ответ написан
dlnsk
@dlnsk
ПК Партнер 01.01 -> ПК Поиск -> IBM PC
Вам нужно сначала получить список id нужных документов в нужном порядке join'ами, а потом запросить уже модели, причем именно в этом порядке:
$ids = \DB::table('documents')
   ->select(['documents.id'])
   ->join('templates', <тут связь>)
   ->orderBy('templates.field_order')
   ->pluck('id');

$list = $ids->implode(',');
$docs = Document::whereIn('id', $ids->toArray())
   ->orderByRaw("find_in_set(id, '$list')")
   ->get();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы