Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 Re: Laravel 5.x » Помогите настроить связи между таблицами » 04.03.2018 20:19:42

Есть два способа — через hasMany и belongsToMany.

Я бы сделал две belongsToMany связи в модели User и была всего одна pivot таблица messages с полями sender_id, receiver_id и message.

#2 Re: Laravel 5.x » Поиск по дате в базе. » 04.03.2018 08:39:01

Второй вариант с замыканиями потребует прокачки всех данных на 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'))

#3 Re: Laravel 5.x » Поиск по дате в базе. » 04.03.2018 08:30:47

я бы поспорил. есть негативный опыт с подобным запросом.

Там два варианта запроса - выполняется только один из них. Первый - это абсолютно стандартный a AND b AND c. Второй - это стандартный (a AND b AND c) OR (d AND e AND f)

#4 Re: Laravel 5.x » Поиск по дате в базе. » 04.03.2018 08:26:30

Прошлая редакция тоже учитывала "Новый Год", но так логика неверная была в общем.

это будет полный перебор таблицы с прокачкой на сторону PHP для проверки. Индусятина, но работает.

Абсолютно нет. Этот код подготовит SQL запрос и вернет только нужные записи.

#5 Re: Laravel 5.x » Поиск по дате в базе. » 03.03.2018 17:08:03

@AlexeyMezenin, мне кажется ты упускаешь из виду особый случай, когда искомый интервал пересекает Новый Год. Чтобы этот кейс корректно разрулить, понадобится проверить ДВА промежутка МЕСЯЦ+ДЕНЬ через OR.

Нет, я его тоже учитывал. От этого вообще не зависит, потому что год в запросе не учитывается вообще, это такой же случай, что и при датах в разных двух месяцах.

Но логика была неверная. Исправил для будущих читателей. Сложно вслепую такое писать, а задающий вопрос уже решил для себя использовать сырой запрос и не пытается поиграть с кодом на своих данных.

#6 Re: Laravel 5.x » Поиск по дате в базе. » 02.03.2018 12:24:37

Я пробовал похожие запросы, все работает. Проверь логику запроса и данные, "поиграй" с ними, если вообще это нужно. Если тебе по-барабану сырой запрос использовать или Eloquent, тогда делай через сырые запросы

#7 Re: Laravel 5.x » Поиск по дате в базе. » 02.03.2018 09:32:11

Да, ты прав. Плюс еще логика запроса неправильная. Обновил код в моем первом сообщении, глянь пожалуйста.

#8 Re: Laravel 5.x » Поиск по дате в базе. » 01.03.2018 23:17:26

Этот метод доступен начиная с 5.5. Если более ранняя версия, нужно заменить все четыре вызова на Carbon::today()

#9 Re: Laravel 5.x » Поиск по дате в базе. » 01.03.2018 23:11:20

Не надо менять код. Каждый вызов subDays(5) меняет переменную.

#11 Re: Laravel 5.x » Поиск по дате в базе. » 01.03.2018 19:24:12

Если по промежутку времени нужно и без сырых запросов то так:

PHP
$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();
}

Т.е. тебе нужно проверить в одном ли месяце находятся эти дни или нет. Логика для каждого случая своя.

#12 Re: Laravel 5.x » Дизайн БД » 11.02.2018 19:18:26

Как вариант, полиморфические связи. Но я бы создал отдельные таблицы, если типов объектов не очень много (рестораны, отели и пр.).

#13 Re: Laravel 5.x » Валидация по двум столбцам в таблице » 09.02.2018 11:43:27

Лучше использовать собственное правило проверки ввода. unique будет работать только если формат ввода и хранения даты один и тот же. Но даже в этом случае я бы сделал собственное правило, т.к. при малейшем изменении функционала unique перестанет работать.

#14 Re: Laravel 5.x » апгрейд dump() функции для распечатки методов » 08.02.2018 11:58:28

Лучше создать и использовать отдельную функцию для этого, но если действительно нужно использовать dump(), тогда ты можешь создать свой собственный helpers.php для глобальных функций помощников и переопределить dump():

function dump($var)
{
    (new Illuminate\Support\Debug\Dumper)->dump($var)
}

#15 Re: Laravel 5.x » многократное использование объекта Builder » 08.02.2018 08:24:44

Ты не сможешь так переиспользовать (да и смысл?). К тому же, в данном случае лучше загрузить данные один раз и уже потом работать с коллекциями:

PHP
$items Item::whereIn('field', ['statement''statement1''statement2''statement3'])->get();

@foreach (
$items->where('field''statement1') as $item)
    {{ 
$item->id }}
@endforeach

#16 Re: Laravel 5.x » Копировать все данные в таблицах с флагом, при добавлении новой записи » 06.02.2018 14:24:05

Один способ — создать новую таблицу через Schema Builder и сделать что-то вроде:

PHP
INSERT IGNORE INTO new_table SELECT FROM old_table

Потом сделать массовый апдейт lang_id одним запросом.

Или создать таблицу, прочитать старую таблицу в коллекцию или массив, изменить lang_id в этой коллекции с помощью ->transform() и сделать массовую вставку через ->insert($array) одним запросом.

#17 Re: Laravel 5.x » Ошибка при миграции. » 05.02.2018 21:02:26

Я не вижу код, поэтому помочь не могу. Если ты говоришь о qrsrc, то смотри на значение, которое показывает dd(), как я показал выше.

#18 Re: Laravel 5.x » Кешированный конфиг, и установка значений в рантайме » 05.02.2018 21:01:05

Нет, не удаляет. Конфиги или кэш считываются при загрузке фреймворка.

Ставить там, где удобнее. Временную зону в сервис провайдере удобнее, конечно же. Систему не нагружет вообще никак.

#19 Re: Laravel 5.x » Ошибка при миграции. » 05.02.2018 20:51:00

Посмотри что код генерирует с помощью dd():

PHP
{{ dd(QrCode::format('png')->size('180')->errorCorrection('H')->encoding('UTF-8')->generate('task qrcode''qrcode/' md5(time()) . '.png')) }}

#20 Re: Laravel 5.x » Ошибка при миграции. » 05.02.2018 20:24:06

Если ты его добавляешь и получаешь ошибку, значит ты забыл включить его в массив $fillable в модели.

#21 Re: Laravel 5.x » unique, помогите разобратся. » 05.02.2018 18:40:25

Мне кажется, что у тебя где-то в соседнем коде исключение кидает. Покажи пожалуйста весь контроллер.

#22 Re: Laravel 5.x » Наследование моделей » 05.02.2018 18:38:59

логика работы разная для элементов с разными типами

Ну тогда наследование делай, либо просто отдельные модели. Но я бы это делал только в крайнем случае.

#23 Re: Laravel 5.x » unique, помогите разобратся. » 05.02.2018 13:45:35

Попробуй передать сообщение как третий параметр:

$this->validate($request, ['name' => 'required|string|min:4|max:25|unique:firms,name'], ['unique' => __('validation.not_unique')]);

#24 Прочее » Как можно удалить комментарий к статье? » 05.02.2018 13:31:47

AlexeyMezenin
Ответов: 0

Доабвил комментарий не там и не могу удалить его. Ссылку на удление не вижу.

#25 Re: Laravel 5.x » Наследование моделей » 05.02.2018 13:23:01

Если таблица одна, то и модель лучше одну иметь а по типам можно фильтровать вручную, либо с помощью локальных заготовок (local scopes):

Element::type(self::TYPE_SOMETHING)->get()

Или сделать для каждого типа отдельный метод:

Element::someType()->get()

Если хочется использовать отдельные модели, то все будет работать, но думаю, что дублированного кода в итоге будет очень много.

Подвал раздела