Лучший способ запросить это в Laravel - PullRequest
1 голос
/ 05 апреля 2019

Я постараюсь максимально упростить этот процесс, чтобы сразу перейти к сути.Если у вас есть какие-либо дополнительные вопросы, дайте мне знать во что бы то ни стало.

У меня есть 2 таблицы следующим образом:

item_centers:

| id | center | identifier | description        |
|----|--------|------------|--------------------|
| 1  | 1A     |       0011 | Description for 1A |
| 2  | 1B     |       0022 | Description for 1B |
| 3  | 1C     |       0033 | Description for 1C |

В центре предметов может быть многопредметы в пути.Столбец «идентификатор» в таблице представляет столбец идентификатора в таблице «элементы» ниже.Таким образом, центр 1А может иметь много «предметов» с идентификатором 0011.

предметов:

| id | identifier | description        | quantity |
|----|------------|--------------------|----------|
| 1  |       0011 | Description for 1A |      250 |
| 2  |       0022 | Description for 1B |      500 |
| 3  |       0033 | Description for 1C |      750 |

У меня есть выпадающий список центров предметов, в котором перечислены все центры предметов по центру от "item_centers "таблица.(Пример: 1А).Наряду с этим раскрывающимся списком у меня есть раскрывающийся список элементов, в котором перечислены все уникальные описания, содержащие ключевое слово из таблицы «элементы».Под этими 2 раскрывающимися списками у меня есть текстовое поле, которое позволяет пользователю вводить количество суммы, которую они пытаются вычесть из выбранного «элемента».

Когда пользователь выбирает item_center,описание товара и клики по нему - у меня есть процесс, который делает это: 1. Получите все товары из таблицы «items» с тем же «идентификатором», что и выбранный в выпадающем списке центра предметов.2. Суммируйте количество всех найденных предметов на первом этапе.3. Вычтите сумму, которую пользователь ввел из списка элементов, начиная с самого старого (столбец create_at).

Итак, к моей проблеме ...

У нас есть много центров элементов, которыесодержать элементы с количеством 0. Я хочу иметь возможность удалить все центры элементов из списка, которые имеют количество 0, чтобы пользователю не приходилось перебирать сотню центров элементов, чтобы найти тот, который имеетколичество выше 0.

Вот быстрый пример того, что я смоделировал.Это, очевидно, ужасный подход, потому что он выполняет тонны запросов - и истечет время ожидания.Но это может работать лучше как макет того, чего я пытаюсь достичь здесь.

public function index()
{
        $itemCenters = ItemCenter::select(['id', 'center', 'identifier', 'description'])
                                    ->orderBy('center', 'asc')
                                    ->orderBy('description', 'asc')
                                    ->get();

        $itemDescriptions = Item::select('description')
                        ->where('description', 'LIKE', '% .$keyword. %')
                        ->orWhere('description', 'LIKE', '.$keyword. %')
                        ->orWhere('description', 'LIKE', '% $.$keyword.')
                        ->distinct('description')
                        ->orderBy('description', 'asc')
                        ->get();

        foreach ($itemCenters as $itemCenter)
        {
            foreach ($itemDescriptions as $itemDescription)
            {
                $currentQty = Item::where('identifier', $itemCenter->identifier)
                                 ->where('description', $itemDescription->description)
                                 ->sum('quantity');


                if ($currentQty <= 0)
                {
                    $itemCenter->forget($itemCenter->id);
                }
            }
        }

        return view('pages.ItemRemoval', compact('itemCenters'), compact('itemDescriptions'));
}

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

Ответы [ 2 ]

0 голосов
/ 06 апреля 2019

С помощью приведенного ниже запроса вам больше не нужен цикл foreach для фильтрации $ itemCenters. Нулевые элементы и, следовательно, соответствующие item_centers уже отфильтрованы.

$itemCenters = DB::table('item_centers')
            ->join('items', 'item_centers.identifier', '=', 'items.identifier')     
            ->select('item_centers.id as id', 'item_centers.center as center', 'item.identifier as identifier', 'item_centers.description as description', 'items.quantity as quantity')
            ->where('quantity', '<>', 0)
            ->orderBy('center', 'asc')
            ->orderBy('description', 'asc')
            ->get();

Для ваших операций может потребоваться выбрать другой столбец ('items.created_at as made_at').

0 голосов
/ 05 апреля 2019

Я думаю, что лучший способ сделать это - использовать отношения laravel, если вы этого не сделаете, было бы так

Модель ItemCenter

public function items()
{
    return $this->hasMany(Item::class);
}

Модель товара

public function itemCenter()
{
    return $this->belongsTo(ItemCenter::class);
}

так что теперь в ваших таблицах вы можете удалить столбцы идентификатора и описания, если они одинаковы в обеих таблицах, и заменить их ключом foriegn item_center_id в таблице элементов, который ссылается на столбец идентификатора в таблице item_centers.

Теперь, чтобы упростить запрос, я думаю, что это будет что-то вроде этого

$item_centers = ItemCenter::with(['items' => function($query){
   $query->havingRaw('SUM(quantity) <= 0 ');
}])->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...