Laravel Eager Loading с некоторыми условиями на обоих концах

Я получаю запрос sql следующим образом:

select * from geofilter_activations where not exists (select * from snap_submissions where geofilter_activations.purchase_id = snap_submissions.purchase_id) and status = 0 and created_at < 2018-10-10 07:15:42 order by id desc limit 1

Но что случилось с запросом, который я добавил, где не указано значение subscription_id? Это не входит в вывод запроса. Дайте мне способ оптимизировать запрос и заставить его работать.

    $time_before = '10';
    $dt = Carbon::now();

    $activation = GeofilterActivation::doesntHave('submission_data')
        ->where('status', '0')
        ->where('created_at', '<', $dt->subMinutes($time_before)->toDateTimeString())
        ->OrderBy('id','desc')
        ->first();

    $activation->load(['purchase' => function ($query) {
        $query->whereNotNull('subscription_id');
    }]);

А модель активации GeoFilterActivation:

<?php

namespace App\Models\Geofilter;

use Illuminate\Database\Eloquent\Model;

class GeofilterActivation extends Model
{
    public function purchase(){
        return $this->belongsTo('App\Models\Geofilter\GeofilterPurchase', 'purchase_id');
    }
    public function submission_data(){
        return $this->belongsTo('App\Models\Geofilter\SnapSubmission', 'purchase_id', 'purchase_id');
    }

    public function ad_stat(){
        return $this->belongsTo('App\Models\Geofilter\SnapAdStat', 'purchase_id', 'purchase_id');
    }

    public function currency(){
        return $this->belongsTo('App\Models\Currency', 'currency_code', 'code');
    }
}

Как вы "получаете запрос sql"?

Jonas Staudenmeir 10.10.2018 18:44
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
1
45
1

Ответы 1

Может быть, что-то в этом роде может вам помочь:

$result = GeofilterActivation::with(['purchase' => function($query) {
        $query->whereNotNull('subscription_id');
    }])
    ->doesntHave('submission_data')
    ->where('status','0')
    ->where('created_at', '<', $dt->subMinutes($time_before)->toDateTimeString())
    ->OrderBy('id','desc')
    ->first();

Причина, по которой ваш запрос не включает этот load, заключается в том, что load вызывается после выполнения вашего запроса, поэтому вы должны включить связь в запрос с использованием with. Пример, который вы упомянули выше с загрузкой, на самом деле является lazy load, потому что вы запрашиваете объект, когда он нужен.

Когда я даю подобное, я получаю следующий запрос: ** выберите * из geofilter_activations, где его нет (выберите * из snap_submissions, где geofilter_activations.purchase_id = snap_submissions.purchase_id) и status = 0 и created_at <2018-10-10 07:52 : 43 заказ по id desc limit 1) **

Adhip 10.10.2018 10:03

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

Nikola Gavric 10.10.2018 10:26

По-прежнему ошибка @Nikola Gavric $ result = GeofilterActivation :: with (['покупка' => функция ($ query) {$ query-> whereNotNull ('subscription_id');}]) -> doesntHave ('submission_data') -> где ('статус', '0') -> где ('created_at1', '<', $ dt-> subMinutes ($ time_before) -> toDateTimeString ()) -> OrderBy (‌ 'id', 'desc') -> первый (‌); select * from geofilter_activations` там, где не существует (выберите * из snap_submissions, где geofilter_activations.purchase_id = snap_submissions.purchase_id) и status = 0 и created_at <2018-10-10 08:50:13 упорядочить по id desc limit 1) `

Adhip 10.10.2018 11:02

Для чего вам нужен submission_data? Можете убрать из запроса или это критично?

Nikola Gavric 10.10.2018 12:00

Да, это важно, это должно быть условие для получения данных только в том случае, если таблица submission_data пуста

Adhip 10.10.2018 15:08

Submission_data - это таблица? Можете ли вы тогда включить для него файл миграции?

Nikola Gavric 10.10.2018 15:10

Другие вопросы по теме