Я получаю запрос sql следующим образом:
select * from
geofilter_activationswhere not exists (select * fromsnap_submissionswheregeofilter_activations.purchase_id=snap_submissions.purchase_id) andstatus= 0 andcreated_at< 2018-10-10 07:15:42 order byiddesc 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');
}
}






Может быть, что-то в этом роде может вам помочь:
$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) **
Что, если вы измените порядок связанных методов, попробуйте сначала вызвать with, а затем doesntHave, я обновил ответ
По-прежнему ошибка @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) `
Для чего вам нужен submission_data? Можете убрать из запроса или это критично?
Да, это важно, это должно быть условие для получения данных только в том случае, если таблица submission_data пуста
Submission_data - это таблица? Можете ли вы тогда включить для него файл миграции?
Как вы "получаете запрос sql"?