
∀RTUR
12.06.2017
17:19:26
добавить всего AND paid until > now
ну и first
я не знаю как сделать)
нужна первая запись подходящая по этим признакам, по одной с пользователя

Google

DDiimmkkaass
12.06.2017
17:22:01
ты когда делаеш Post::with('tags')->get() - то в ларавела это будет два запроса
один для постов, другой для тегов к ним
ты сейчас показал запрос, который у тебя тянет самих пользователей
а проблема как раз в другом запросе, том который тянет пеймент для пользователя (если я верно понял суть проблемы)

∀RTUR
12.06.2017
17:23:35

DDiimmkkaass
12.06.2017
17:24:22
что за ошибка?
и попробуй все-таки убрать оттуда first()

∀RTUR
12.06.2017
17:25:01
BadMethodCallException: Method whereHas does not exist.

DDiimmkkaass
12.06.2017
17:25:15
)
после get() - whereHas уже не доступен
там же уже колекция

∀RTUR
12.06.2017
17:26:11
where ?

DDiimmkkaass
12.06.2017
17:36:10
не понял что ты хочеш сделать?
если вывести то что вытягивает $test, тогда dd($test->get())

Google

∀RTUR
12.06.2017
17:37:30
он должен sql запрос вывести
а потом уже посмотреть результаты
через ->get

DDiimmkkaass
12.06.2017
17:38:27
ну тогда dd($test->toSql(), $test->get())

∀RTUR
12.06.2017
17:40:33
в итоге сейчас всё так же само)
такой же результат
выводит всех у кого просто есть в payments запись
а надо paid until > now() limit 1

DDiimmkkaass
12.06.2017
17:45:52
кинь код, не хочу переписывать с картинки

∀RTUR
12.06.2017
17:48:11
$test = TelegramBotUser::with(['payments' => function ($q) {
return $q->where('paid_until', '>', Carbon::now())->first();
}]);
return $test->whereHas('payments.price', function ($q) {
return $q->whereIn('package_id', [2, 3]);
});

DDiimmkkaass
12.06.2017
17:52:13
выводит всех у кого просто есть в payments запись
а надо paid until > now() limit 1
так тебе нужно, только тех пользователей у которых есть payments.price с pakage_id = 2 или 3 и для каждого из них по одному пейменту с paid_until > now()
или всех пользователей у которых есть payments.price с pakage_id = 2 или 3 и при этом что б payments брались только те у которых paid_until > now() ну и соответственно для пользователей подтягивался первый такой платеж ?

∀RTUR
12.06.2017
17:53:04
сейчас объясню почему
paid until > now() limit 1 для того чтобы определить активный на данный момент пакет
paid until > now() ищет живые подписки
limit 1 выбирает первую из них

Google

∀RTUR
12.06.2017
17:54:49
что работает сейчас. потому что может быть их несколько. период работы каждой идет один за другим
user:
id
1
2
3
payments:
id | user_id | package_price_id | amount
1 | 1 | 1 | 200
2 | 1 | 2 | 250
3 | 2 | 3 | 300
package_prices:
id | months | package_id
1 | 1 | 1
2 | 2 | 1
...
12 | 12 | 1
...
13 | 1 | 2
packages
id | name
1 | test
2 | middle
3 | full
вот собственно все модели


DDiimmkkaass
12.06.2017
17:58:04
там просто разница в запросах будет
твой код подходит для первого (собственно то что тебе и надо)
а второй вариант, там будет еще одно условие - но раз это не оно, то и не буде акцентировать
а paid_until где?)
ясно, что в payments, но на скрине просто без)

∀RTUR
12.06.2017
18:01:49

DDiimmkkaass
12.06.2017
18:02:21

∀RTUR
12.06.2017
18:02:44
это копипаста старая
просто не написал

∀RTUR
12.06.2017
18:03:02
уже бился в чаты с просьбой помощи)

DDiimmkkaass
12.06.2017
18:03:22
)
думаю надо ити от меньшего
$test = TelegramBotUser::with(['payments' => function ($q) {
$q->where('paid_until', '>', Carbon::now());
}]);
dd($test->get())
это должно вернуть пользователей
и для них только те пейменты у которых paid_until > Carbon::now()

∀RTUR
12.06.2017
18:09:43
странно
и first то же самое

Google

DDiimmkkaass
12.06.2017
18:11:23
так и должно быть
все пользователи
смотри теперь в пейменты для них

∀RTUR
12.06.2017
18:11:55
"select * from `telegram_bot_users`" 1 2018-05-09 00:00:00
что-то такое вывело toSql

DDiimmkkaass
12.06.2017
18:11:59
там должны быть только те пейменты у которых 'paid_until', '>', Carbon::now()

∀RTUR
12.06.2017
18:12:06
у них нет payment'ов
у всех

DDiimmkkaass
12.06.2017
18:13:28
значит ни у кого из пользователей нет пейментов для которых 'paid_until', '>', Carbon::now()
так?

∀RTUR
12.06.2017
18:14:06
из тех что вывелось - это те у которых есть пейменты и у которых нет

Admin
ERROR: S client not available

∀RTUR
12.06.2017
18:14:09
это просто все
оч странно

DDiimmkkaass
12.06.2017
18:15:13
ну в этом запросе и нет условия каких пользователей выводить
просто нужно увидеть, правильно ли выбираються для пользователей пейменти

∀RTUR
12.06.2017
18:17:29
определенно нет :D
до этого правильно было вроде
только что-то не цеплялось что нужно

DDiimmkkaass
12.06.2017
18:18:37

∀RTUR
12.06.2017
18:18:41
нужно вывести всех у кого есть payments?

Google

∀RTUR
12.06.2017
18:19:30
хотел предложить кое-что, но сам понял что не знаю как)

DDiimmkkaass
12.06.2017
18:19:30
у тебя запрос на выбор пользователей работает верно, поетому его можно откинуть
и разобраться со связью
потому как в ней проблема

∀RTUR
12.06.2017
18:19:46
типа Users::all()->payments

DDiimmkkaass
12.06.2017
18:21:21
вот тот код, который я скинул и только что тестили, как раз должен вытянуть для каждого из пользователей только те пейменты которые подходят под условие 'paid_until', '>', Carbon::now()
поетому я и спросил - правильно ли для пользователей выбираються пейменти

∀RTUR
12.06.2017
18:25:02
этой связи?
payments:
$this->hasMany(Payment::class, 'user_id');
а
кажется не так сделал
на выводе

DDiimmkkaass
12.06.2017
18:27:15

∀RTUR
12.06.2017
18:28:00

DDiimmkkaass
12.06.2017
18:28:27
вот, а теперь нужно смотреть в relation для пользователей
и там где есть масив payments должны быть только те пейменты у которых paid_until', '>', Carbon::now()

∀RTUR
12.06.2017
18:30:54
момент
не момент?
хочу вывести пейменты те самые
сейчас попробую цикл в цикле