Не могу извлечь запись из строки таблицы большого масштаба - PullRequest
0 голосов
/ 03 июля 2018

Я использую Laravel Framework. В моей таблице записей базы данных более 400000 строк. Теперь я хочу получить запись, используя некоторые условия логика: нужно совпадать с идентификатором сервиса необходимо соответствовать статусу

но мое приложение не может получить данные (не может обработать этот запрос). Я использую запрос, используя этот

foreach ($ven as $ven){
    $data = $ven->data;
    $record = $data ->records()->where('status','success')->get();
}

Мой столбец статуса уже добавлен в индекс.

Требуется предложение

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Способ, которым вы пытаетесь получить доступ к связанным записям в цикле, может создать N + 1 проблему

Согласно официальным документам При доступе к отношениям Eloquent в качестве свойств данные отношений «загружаются лениво». Это означает, что данные отношения фактически не загружаются, пока вы не получите первый доступ к свойству. Однако Eloquent может «загружать» отношения во время запроса родительской модели. Стремительная загрузка облегчает проблему запроса N + 1

Вы можете загрузить соответствующие данные как

$results = ParentModel::with('records')
                        ->where(...) /* If there are any filters for ParentModel */
                        ->get();    

Для быстрой загрузки будет выполнено только 2 запроса, чтобы получить ваши данные для основной модели и связанной модели. Каждая строка в $results будет представлять собой набор связанных записей, которые вы можете перебирать, чтобы перечислять детали каждого связанного объекта.

Чтобы получить отфильтрованные строки связанной модели, вы можете изменить метод with() как

$results = ParentModel::with(['records' => function ($query) {
                            $query->where('status','=','success');
                        }])
                        ->where(...) /* If there are any filters for ParentModel */
                        ->get();

Чтобы получить отфильтрованные строки ParentModel на основе связанных записей, вы можете использовать whereHas

$results = ParentModel::with('records')
                        ->where(...) /* If there are any filters for ParentModel */
                        ->whereHas('records', function ($query) {
                            $query->where('status','=','success');
                        })->get();
0 голосов
/ 04 июля 2018

Для начала нужно сохранить статусы в виде int, а не в виде строк. Это поможет вам легко фильтровать записи.

И используйте chunk для обработки больших наборов данных. Я полагаю, $ven для места. Итак, следуйте приведенному ниже коду.

DB::table('venues')
->select('venues.*', 'records.*')
            ->join('records', 'venues.id', '=', 'records.venue_id')
             ->orderBy('id')->chunk(1000, function($venues) {
    foreach ($venues as $venue) {
        // your logic
    }
});

Примечание: Я использовал построитель запросов вместо eloquent. Это потому, что построитель запросов быстрее, чем красноречивый.

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