Как вы выбираете различные () модели на основе определенного столбца с Laravel? - PullRequest
0 голосов
/ 13 октября 2019

У меня есть база данных, в которой я храню документы - некоторые независимы друг от друга, но некоторые являются просто «следующей версией» предыдущего документа. В этом случае я сохраняю идентификатор последней версии в столбце.

Пример набора данных будет выглядеть следующим образом:

id | name       | version | validated | latest_version_id
 1 | 'Doc 1'    |       1 |      true | null
 2 | 'Doc 2'    |       1 |      true | null
 3 | 'Doc 3 v1' |       1 |      true |    5
 4 | 'Doc 3 v2' |       2 |      true |    5
 5 | 'Doc 3 v3' |       3 |     false |    5

Я хотел бы иметь возможность выбрать все проверенные документы в их последней версии. Обычно это запрос, который возвращает строки 1, 2 и 4. в наборе данных.

Я надеялся получить что-то вроде Docs::where('validated', true)->distinct('latest_version_id')->get(), но, очевидно, это не так просто, как это ..

Любойзапрос гуру, чтобы указать мне в правильном направлении? Решением было бы получить все результаты, а затем отфильтровать некоторые модели, но это не очень оптимизировано.

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Я согласен с Watercayman, вы должны подумать о рефакторинге. В краткосрочной перспективе вы можете использовать следующее, но это не на 100% надежно, но оно достигнет того, что вы хотите с вашим текущим набором данных

  $unversioned = Doc::query()->whereNull('latest_version_id')->where('validated', true);
  $versioned = DB::table(DB::raw("(SELECT * 
                                   FROM docs WHERE latest_version_id IS NOT NULL AND validated = true 
                                   ORDER BY version DESC) as t"))
                            ->groupBy('latest_version_id');

  $unversioned->union($versioned)->get();

Обратите внимание, что модели должны быть единичными - вот почему яназывается Doc ::, а не Docs ::

1 голос
/ 13 октября 2019

Я думаю, что у вас будут проблемы, потому что не существует уникального способа (который я вижу) определить, что документ связан с другим документом. IE Doc 3 v1 - это тот же документ, что и Doc 3 v2 для человека ... но как приложение узнает об этом? Как он ищет, чтобы узнать, какие распространены, и, таким образом, проверить наличие последней версии этого конкретного документа?

Я думаю, что вашим лучшим решением может быть, если вы сможете немного изменить архитектуру хранения данных, чтобы, возможно, предоставить FK для набора документов, вы можете решить эту проблему. Таким образом, «таблица документов» позволяет запросу точно знать, какие документы совпадают. Тогда ваша существующая таблица выше будет иметь FK doc_id в дополнение к существующему столбцу name. Таким образом, вы устраняете проблему различных имен (все они будут прикреплены к одному и тому же основному документу FK). Это позволит вам затем показать, какая версия соответствует этому конкретному главному документу и какой набор принадлежит этим версиям, и тогда вы сможете значительно проще управлять запросом на основе этих параметров.

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