Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Второй вариант с замыканиями потребует прокачки всех данных на PHP.
Нет, не потребует. Вот первый запрос, генерируемый Eloquent
select * from `users` where month(`created_at`) = '02' and day(`created_at`) >= '12' and day(`created_at`) <= '22'
Вот второй запрос (более сложный):
select * from `users` where ((month(`created_at`) = '02' and day(`created_at`) >= '27' and day(`created_at`) <= '28') or (month(`created_at`) = '03' and day(`created_at`) >= '01' and day(`created_at`) <= '09'))
я бы поспорил. есть негативный опыт с подобным запросом.
Там два варианта запроса - выполняется только один из них. Первый - это абсолютно стандартный a AND b AND c. Второй - это стандартный (a AND b AND c) OR (d AND e AND f)
Прошлая редакция тоже учитывала "Новый Год", но так логика неверная была в общем.
это будет полный перебор таблицы с прокачкой на сторону PHP для проверки. Индусятина, но работает.
Абсолютно нет. Этот код подготовит SQL запрос и вернет только нужные записи.
@AlexeyMezenin, мне кажется ты упускаешь из виду особый случай, когда искомый интервал пересекает Новый Год. Чтобы этот кейс корректно разрулить, понадобится проверить ДВА промежутка МЕСЯЦ+ДЕНЬ через OR.
Нет, я его тоже учитывал. От этого вообще не зависит, потому что год в запросе не учитывается вообще, это такой же случай, что и при датах в разных двух месяцах.
Но логика была неверная. Исправил для будущих читателей. Сложно вслепую такое писать, а задающий вопрос уже решил для себя использовать сырой запрос и не пытается поиграть с кодом на своих данных.
Я пробовал похожие запросы, все работает. Проверь логику запроса и данные, "поиграй" с ними, если вообще это нужно. Если тебе по-барабану сырой запрос использовать или Eloquent, тогда делай через сырые запросы
Этот метод доступен начиная с 5.5. Если более ранняя версия, нужно заменить все четыре вызова на Carbon::today()
Если по промежутку времени нужно и без сырых запросов то так:
$startDate = Carbon::today()->subDays(5);
$endDate = Carbon::today()->addDays(5);
if ($startMonth === $endMonth) {
$users = User::whereMonth('created_at', $startDate->format('m'))
->whereDay('created_at', '>=', $startDate->format('d'))
->whereDay('created_at', '<=', $endDate->format('d'))
->get();
} else {
$users = User::where(function($q) use($startDate) {
$q->whereMonth('created_at', $startDate->format('m'))
->whereDay('created_at', '>=', $startDate->format('d'))
->whereDay('created_at', '<=', $startDate->copy()->endOfMonth()->format('d'));
})
->orWhere(function($q) use($endDate) {
$q->whereMonth('created_at', $endDate->format('m'))
->whereDay('created_at', '>=', $endDate->copy()->startOfMonth()->format('d'))
->whereDay('created_at', '<=', $endDate->format('d'));
})
->get();
}
Т.е. тебе нужно проверить в одном ли месяце находятся эти дни или нет. Логика для каждого случая своя.
Как вариант, полиморфические связи. Но я бы создал отдельные таблицы, если типов объектов не очень много (рестораны, отели и пр.).
Лучше использовать собственное правило проверки ввода. unique будет работать только если формат ввода и хранения даты один и тот же. Но даже в этом случае я бы сделал собственное правило, т.к. при малейшем изменении функционала unique перестанет работать.
Лучше создать и использовать отдельную функцию для этого, но если действительно нужно использовать dump(), тогда ты можешь создать свой собственный helpers.php для глобальных функций помощников и переопределить dump():
function dump($var)
{
(new Illuminate\Support\Debug\Dumper)->dump($var)
}
Ты не сможешь так переиспользовать (да и смысл?). К тому же, в данном случае лучше загрузить данные один раз и уже потом работать с коллекциями:
$items = Item::whereIn('field', ['statement', 'statement1', 'statement2', 'statement3'])->get();
@foreach ($items->where('field', 'statement1') as $item)
{{ $item->id }}
@endforeach
Один способ — создать новую таблицу через Schema Builder и сделать что-то вроде:
INSERT IGNORE INTO new_table SELECT * FROM old_table
Потом сделать массовый апдейт lang_id одним запросом.
Или создать таблицу, прочитать старую таблицу в коллекцию или массив, изменить lang_id в этой коллекции с помощью ->transform() и сделать массовую вставку через ->insert($array) одним запросом.
Если ты его добавляешь и получаешь ошибку, значит ты забыл включить его в массив $fillable в модели.
Мне кажется, что у тебя где-то в соседнем коде исключение кидает. Покажи пожалуйста весь контроллер.
логика работы разная для элементов с разными типами
Ну тогда наследование делай, либо просто отдельные модели. Но я бы это делал только в крайнем случае.
Попробуй передать сообщение как третий параметр:
$this->validate($request, ['name' => 'required|string|min:4|max:25|unique:firms,name'], ['unique' => __('validation.not_unique')]);
Доабвил комментарий не там и не могу удалить его. Ссылку на удление не вижу.
Если таблица одна, то и модель лучше одну иметь а по типам можно фильтровать вручную, либо с помощью локальных заготовок (local scopes):
Element::type(self::TYPE_SOMETHING)->get()
Или сделать для каждого типа отдельный метод:
Element::someType()->get()
Если хочется использовать отдельные модели, то все будет работать, но думаю, что дублированного кода в итоге будет очень много.