laravel красноречивый комплекс, выделенный внутри оператора where - PullRequest
0 голосов
/ 09 апреля 2020

ореол, у меня есть данные, и я хочу отобразить их, как показано на рисунке ниже

enter image description here

существует две модели отношений: персона и взнос.

это модель человека:

class Person extends Model
{
    protected $table = 'person';
    public function angsuran()
    {
        return $this->hasMany(Installment::class);
    }
}

это модель взноса:

class Installment extends Model
{
    protected $table = 'installment';
    public function person()
    {
        return $this->belongsTo(Person::class);
    }
}

и это мой контроллер для запроса и отображения данных

$data = Person::with('angsuran')
        ->whereHas('angsuran', function ($q) {
             $q->whereBetween('installment_date', [\DB::raw('CURDATE()'), \DB::raw('CURDATE() + INTERVAL 7 DAY')])
               ->where('installment_date', '=', function () use ($q) {
                  $q->select('installment_date')
                    ->where('status', 'UNPAID')
                    ->orderBy('installment_date', 'ASC')
                    ->first();
                });
            });
return $data->get();

это показывает ошибку неизвестный столбец person.id, где пункт , пожалуйста, помогите. спасибо.

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

Используя with и whereHas, вы получите два запроса, даже если у вас есть limit(1) в вашем подзапросе, и результат покажет все 4 части, относящиеся к модели персонажа. Кроме того, я не думаю, что вы можете заказать подзапрос, это должно быть до -> get

, поэтому я переписал ваш код

$callback = function($query) {
    $query->whereBetween('installment_date', [today(), today()->addDays(7)])
            ->where('status', 'UNPAID')
            ->orderBy('installment_date');
    };

$data = Person::whereHas('angsuran', $callback)->with(['angsuran' => $callback])->get();

или вы можете использовать область запроса , пожалуйста, посмотрите этот ответ Объедините 'с' и 'whereHas' в Laravel 5

1 голос
/ 09 апреля 2020

Как сказано в комментарии, вы должны указать $q в качестве параметра для Closure.

При использовании подзапросов полезно сообщить построителю запросов, из какой таблицы он должен запрашивать.

Я переписал ваш запрос. Это должно достичь того, что вы ищете. Кроме того, CURDATE изменено на объекты Carbon.

today() возвращает дату и время на сегодняшний день в 00:00:00 часов. Если вам нужны часы, минуты и секунды, замените today() на now().

$data = Person::with('angsuran')
->whereHas('angsuran', function ($subquery1) {
    $subquery1->where('installment_date', function ($subquery2) {
        $subquery2->from('installment')
        ->select('created_at')
        ->where('status', 'UNPAID')
        ->whereBetween('installment_date', [today(), today()->addWeeks(1)])
        ->orderBy('installment_date')
        ->limit(1);
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...