Как получить все первые записи (упорядоченные по столбцу) вложенного отношения один ко многим в Laravel? - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть некоторые вложенные отношения один ко многим следующим образом:

Enquiry hasMany Item

Item hasMany Component

Component hasMany Process

Представьте, что у меня уже загружена модель Enquiry. Теперь я хотел бы получить доступ к первым Process каждого Component каждого Item, упорядоченного столбцом в Process, называемом order

This picture might show it better (Sorry for using ERD like this)

Эта картинка могла бы показать ее лучше (извините за использование ERD, как это)

То, что у меня есть, примерно так:

$enquiry->items->load(['components' => function($query) {
    $query->with(['processes' => function($query) {
        $query->orderBy('order')->limit(1)
    }]);
}])->get();

, но это только дает мне верхний процесс, а не верхний Process каждого Component каждого Item, принадлежащего данному Enquiry.

. Любая помощь будет принята с благодарностью. И, конечно же, любая помощь, касающаяся лучшего названия, также будет высоко оценена. Спасибо.

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Не можете ли вы определить отношения в вашей модели компонентов следующим образом:

class Component {
    public function firstProcess() {
        return $this->hasMany(Process::class)->orderBy('order')->take(1);
    }
}

А затем сделать что-то вроде этого:

$enquiry->load('items.components.firstProcess');

Тогда вы сможете получить доступ к этому свойство каждого из ваших компонентов:

foreach ($enquiry->items as $item) {
    foreach($item->components as $component) {
        print_r($component->firstProcess);
    }
}

Я не проверял этот код.

0 голосов
/ 10 февраля 2020

Благодаря @PaulSpiegel Link он направил меня в нужное русло. Вот как я сделал это с подзапросами в Laravel, используя QueryBuilder.

$subQuery = DB::table('processes as icp')
            ->selectRaw('min(icp.order), icp.*')
            ->groupBy('icp.component_id');

$firstProcesses = DB::table('enquiries as enq')
            ->where('enq.id', $enquiry->id)
            ->join('items', 'items.enquiry_id', 'enq.id')
            ->join('components as ic', 'ic.item_id', 'items.id')
            ->joinSub($subQuery, 'icp', function ($join) {
                $join->on('ic.id', 'icp.component_id');
            })->get();
...