Ответы пользователя по тегу Laravel
  • Почему не срабатывает редирект?

    iMedved2009
    @iMedved2009
    Не люблю людей
    У вас какой то странный метод. Судя по всему он у вас предназначен для post запросов.
    php artisan route:list | grep login что покажет
    Ответ написан
    Комментировать
  • Почему не удается получить значение куки из request?

    iMedved2009
    @iMedved2009
    Не люблю людей
    смотрите. функция $next($request) передает реквест дальше в обработку. это "дальше в обработку" включает в себя и экшен в контролере. Это используется например для того что бы после всех обработок - навешать еще какой нибудь обработчик который что то сделает с тем контентом который создал контроллер.
    В качестве примера пример собственно из EncryptCookies, наверное пример из самой ларки будет понятнее
    public function handle($request, Closure $next)
        {
            return $this->encrypt($next($this->decrypt($request)));
        }

    Собственно порядок выполнения: расшифровываем куки, передаем управление дальше в остальные middleware и controller, получив результат зашифровываем куки.

    2. Сильное подозрение что вы что то навертели в куках. А именно ларка куки шифрует. По этому в $_COOKIE['counter'] у вас должна лежать абракадабра - которую вы прочитать не сможете. Если там лежит число - то его не сможет прочитать ларка потому что она ждет что там будет что то шифрованное.

    3. А навертели вы следующее - исходя из 1 пункта, установка куки пролетает мимо middleware EncryptCookies и скорее всего отдается в чистом виде - и по этому при обновлении страницы Ларка не может эту куку прочитать.

    Решение - добавить counter в $except в миддлеваре EncryptCookies или ставить ее раньше, посмотреть часть доки Ларки посвященному обработке запроса, и не трогать при работе с Ларкой $_GET, $_POST, $_COOKIE
    Ответ написан
    Комментировать
  • Как я могу ввести в класс значение из роута при привязки?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Как нибудь через route binding?

    RouteServiceProvider.php
    
    Route::bind('test', function (string $value) {
            return new Test($value);
    });
    
    web.php
    Route::get('/{test}', [TestController::class, 'index']);
    
    TestController.php
    class TestController extends Controller
    {
    
    public function index(Request $request, Test $test){
        dd($test);
    }
    Ответ написан
    Комментировать
  • Как правильно построить запрос к БД в Laravel 6 на получение данных с запросами на фильтр и вывести все в пагинацию по полю с отношениями?

    iMedved2009
    @iMedved2009
    Не люблю людей
    public function category(Request $request, $code) {
            //Получаю все товары данной катигории следующим образом: $category->products
            $category = Category::where('code', $code)->firstOrFail();
            //А пагинация строится в отдельном запросе к таблице Товаров
            $products = $category->products()
             ->when(($request->get('price_min'), function(Builder $query, $price_min){
                return $query->where('price', '>=', $price_min);
            })->when(($request->get('price_max'), function(Builder $query, $price_max){
                return $query->where('price', '<=', $price_max);
            })->paginate(4);
    
            return view('category', compact('category', 'products'));
        }
    Ответ написан
    1 комментарий
  • Как построить запрос к базе данных, сделать выборку данных через таблицы со связями многие ко многим?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Как нибудь так.
    $discounts = Discount::whereHas('product', function($query) use ($ids) {
            $query->whereHas('categories', function($query) use ($ids) {
                    $query->whereIn('id', $ids);
            }));
    })->get();
    Ответ написан
  • Как в отношениях получить значение одной колонки без массива?

    iMedved2009
    @iMedved2009
    Не люблю людей
    public function scopeAppendEmail(Builder $builder){
          $builder->select(DB::raw('mymodel_table.*, (select email from users where user_id = users.id limit 1) as user_email'));
    }
    
    MyModel::appendEmail()->get();
    Ответ написан
    Комментировать
  • Почему выдаёт ошибку?

    iMedved2009
    @iMedved2009
    Не люблю людей
    public function up(): void
        {
            Schema::create('products', function (Blueprint $table) {
                $table->id();
                $table->timestamps();
    
                $table->string('name');
                $table->integer('price');
                $table->text('des');
                $table->unsignedBigInteger('category_id');
                $table->foreign('category_id')->references('id')->on('categories');
            });
        }
    Ответ написан
    Комментировать
  • Как в sail исправить SET GLOBAL sql_mode?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Hfnas, я вам предлагаю не трогать SQL_MODE и забыть про его существовании. Вернуться к тому что вы хотите выбрать и написать запрос так что бы у вас работало с нормальным sql_mode.

    Обьясняю подробнее. Представим что у нас есть таблица table
    id, city_name, number, country_id
    1,Берлин, 100, 1;
    2,Дортмундт, 200, 1;
    3,Гамбург 300, 1;
    4,Москва, 100, 2;
    4,Самара, 200, 2;

    Теперь представим что мы выполняем запрос с группировкой.
    select sum(number), country_id from table group by country_id;

    здесь mysql все понимает. ему нужно вернуть сумму чисел и country_id - вуаля
    600,1
    300,2

    Теперь мы отправляем ему непонятный запрос.
    select sum(number), city_name, country_id from table group by country_id;

    И мускул начинает ругаться. Потому что если он группирует по country_id, то он не знает какой city_name вам вывести -- в каждой строке может быть несколько вариантов.

    600, (Берлин или Дортмундт или Гамбург), 1
    300, (Москва или Самара), 2

    какой конкретно вам надо вывести? ему неизвестно - он об этому вам говорит . Своим подходом а щас я sql_mode подправлю - вы банально пытаетесь заткнуть MySQL рот что бы он не задавал вам непонятных вопросов. Ну не вопрос - вы это сделаете. Кому от этого станет лучше? Вам? Вряд ли, если вам плевать что вам в city_name вернется - нахрен вы это поле выбираете. Если вам не плевать - тогда напишите запрос так, что бы вам возвращалось нужное
    Ответ написан
    Комментировать
  • Как сделать из сводной таблицы связь one to one?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Как то так
    public function project(): HasOne 
        {
            $instance = $this->newRelatedInstance(Project::class);
            $relation = new HasOne($instance->newQuery(), $this, DB::raw('project_user.user_id'), $this->getKeyName());
    
            return $relation->leftJoin('project_user', 'project_user.project_id', '=', 'projects.id');
        }
    Ответ написан
    Комментировать
  • Как добиться баланса между скоростью и производительностью при импорте ~200к строк в базу данных?

    iMedved2009
    @iMedved2009
    Не люблю людей
    В данный конкретный вариант у вас похоже реализован самый медленный вариант вставки - а именно куча отдельных insert, с коммитом после каждой, ибо никакой магии в saveMany нету - в цикле обходим массив и по одному вставляем.

    1. Использовать номальный bulk insert. Это вроде как делается просто
    Model::insert([
      [row1], [row2], [row3], [row4], 
    ]);

    тогда на выходе вы должны получить запрос вида insert into table() values(row1), (row2), (row3);

    2. Обернуть в транзакцию как советовал JhaoDa . Это хуже чем первый вариант, но лучше вашего.
    Ответ написан
    2 комментария
  • Как сделать опциональные поля в DTO?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Как то так?
    public static function fromRequest(FormRequest $request): static
        {
            $data = $request->validated();
            $properties = (new \ReflectionClass(self::class))->getProperties(\ReflectionProperty::IS_PUBLIC);
            foreach ($properties as $property){
                if(!isset($data[$property->name])){
                       $data[$property->name] = $property->getDefaultValue();
                }
            }
            return new static(...$data);
        }
    Ответ написан
    Комментировать
  • Как провалидировать список на laravel в кастомном правиле?

    iMedved2009
    @iMedved2009
    Не люблю людей
    public function __invoke($attribute, $value, $fail)
        {
            $dishesRequest = collect($value);
            $data = Dishe::whereIn('id', $dishesRequest)->Active()->whereHas('menu', function ($query) {
                    return $query->where('project_id', $this->project->id)->Active();
            })->selectRaw('count(1) as count, sum(price) as sum');
            if($data->count !=  $dishesRequest->count()){
                    return $fail(__('validation.exists'));
            }
            # Получаем список блюд по массиву идентификаторов
            $totalDishes = $data->sum;
            $total = $this->order ? $totalDishes + $this->order->totalPrice : $totalDishes;
    
            if ($total < 1 || $total > 150000) {
                return $fail('Сумма заказа должна быть от 1 ₽ до 150 000 ₽');
            }
        }


    Но вторую проверку я бы наверное вынес. Но не уверен
    Ответ написан
    7 комментариев
  • Почему событие (наблюдатель) модели возвращает некорректный первичный ключ?

    iMedved2009
    @iMedved2009
    Не люблю людей
    class Email extends Model
    {
        ...................
        public $incrementing = false;
        ...................
    }
    Ответ написан
    1 комментарий
  • Как ограничить или оптимизировать доступ к валидации параметров на laravel в request?

    iMedved2009
    @iMedved2009
    Не люблю людей
    php artisan make:policy OrderPolicy

    class OrderPolicy
    {
        use HandlesAuthorization;
    
        public function update(User $user, Order $order)
        {
             if (!$user->isEmployee()) {
                    return false;
             }
             if ($user->id !== $order->user_id) { // остальной кусок ифа не понял - но он должен быть здесь.
                    return false;
              }
    
              return in_array($order->status, [Order::NEW, Order::WORK]);
        }
    
    }
    
    class OrderUpdateRequest extends FormRequest
    {
        public function authorize()
        {
              return $this->user()->can('update', $this->order);
        } 
    }
    Ответ написан
  • Как подсчитать кол-во символов через связь?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Если MySQL
    public function count_votes(){
             return $this->hasOne(Vote::class, 'user_id')->select(DB::raw('sum(IF(vote=1, 1, 0)) as vote_yes, sum(IF(vote=2, 1, 0)) as vote_no, sum(IF(vote=3, 1, 0)) as vote_net, user_id'))->groupBy('user_id');
    }
    Ответ написан
    Комментировать
  • Как мне построить "строгий" whereIn в laravel eloquent builder?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Document::whereHas('categories', function ( $query){
                $query->whereIn('resource_category_id', [10,5]);
     }, '>', 1)->get();
    Ответ написан
    3 комментария
  • Как удалить или скрыть связующую модель из коллекции?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Ответ написан
    Комментировать
  • Как проверить что c указанной даты уже прошло 18 лет в Ларавель?

    iMedved2009
    @iMedved2009
    Не люблю людей
    before

    Validator::make([
                'birthday' => '01.03.1995'
            ], [
                'birthday' => 'date|before:сюда захерачить now() - 18 лет'
            ])
    Ответ написан
    Комментировать
  • Как связать значения характеристики с товаром?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Окей берем вариант Дмитрий Л
    products
    --- id
    --- name

    product_attributes
    --- id
    --- name

    product_attribute_values
    --- id
    --- attribute_id
    --- product_id
    --- value

    Окей. Предположим

    class Product

    class Product extends Model
    {
        use HasFactory;
    
        protected $fillable = ['name'];
    
        public function attributes(): BelongsToMany
        {
            return $this->belongsToMany(Attribute::class, 'product_attribute_value')->withPivot(['value']);
        }
    }


    class Attribute

    class Attribute extends Model
    {
        use HasFactory;
    
        protected $fillable = ['name'];
    
        public function getValuesAttribute($value){
            return collect(explode(',', $value));
        }
    }


    данные

    $a1 = \App\Models\Attribute::create([
                'name' => 'Attr1',
            ]);
            $a2 = \App\Models\Attribute::create([
                'name' => 'Attr2',
            ]);
            $a3 = \App\Models\Attribute::create([
                'name' => 'Multy Attr3',
            ]);
    
    
            $p1 = \App\Models\Product::create([
                'name' => 'Product1',
            ]);
            $p1->attributes()->attach($a1->id, [
                'value' => '2012',
            ]);
            $p1->attributes()->attach($a2->id, [
                'value' => 'Джинса',
            ]);
            $p1->attributes()->attach($a3->id, [
                'value' => 'Синий',
            ]);
            $p1->attributes()->attach($a3->id, [
                'value' => 'Черный',
            ]);
            $p1->attributes()->attach($a3->id, [
                'value' => 'Зеленый',
            ]);
    
    
    
            $p2 = \App\Models\Product::create([
                'name' => 'Product2',
            ]);
            $p2->attributes()->attach($a1->id, [
                'value' => '2013',
            ]);
            $p2->attributes()->attach($a2->id, [
                'value' => 'Лен',
            ]);
            $p2->attributes()->attach($a3->id, [
                'value' => 'Красный',
            ]);
            $p2->attributes()->attach($a3->id, [
                'value' => 'Серобурый',
            ]);
    
            $p3 = \App\Models\Product::create([
                'name' => 'Product3',
            ]);
            $p3->attributes()->attach($a1->id, [
                'value' => '2015',
            ]);
            $p3->attributes()->attach($a2->id, [
                'value' => 'Лен',
            ]);
            $p3->attributes()->attach($a3->id, [
                'value' => 'Синий',
            ]);
            $p3->attributes()->attach($a3->id, [
                'value' => 'Желтый',
            ]);



    Естественно если мы дернем $products = Product::with('attributes')->get(); то у нас будет картинка которая автору не нравится.

    Но нет препятствий патриотам, добавляем в класс Product метод
    public function attributes_with_grouped_values(): HasMany{
            $instance = $this->newRelatedInstance(Attribute::class);
    
            $query = $instance->newQuery()->join('product_attribute_value', 'product_attribute_value.attribute_id', '=', 'attributes.id')
                ->groupBy('attributes.id', 'attributes.name', 'product_attribute_value.product_id')
                ->select('attributes.id', 'attributes.name', 'product_id', DB::raw('string_agg(product_attribute_value.value, \',\') as values'));
            // в случае с мускул string_agg(product_attribute_value.value, \',\') заменить на group_concact
            return $this->newHasMany(
                $query, $this, 'product_attribute_value.product_id', 'id'
            );
        }


    добавляем в класс Attribute метод
    public function getValuesAttribute($value){
            return collect(explode(',', $value));
        }


    Проверяем

    $products = Product::with('attributes_with_grouped_values')->get();
            foreach ($products as $product){
                echo $product->name.PHP_EOL;
                foreach ($product->attributes_with_grouped_values as $attribute){
                    dump(json_encode([$attribute->name => $attribute->values->all()]));
                }
            }


    Product1
    ^ "{"Attr1":["2012"]}"
    ^ "{"Attr2":["\u0414\u0436\u0438\u043d\u0441\u0430"]}"
    ^ "{"Multy Attr3":["\u0421\u0438\u043d\u0438\u0439","\u0417\u0435\u043b\u0435\u043d\u044b\u0439","\u0427\u0435\u0440\u043d\u044b\u0439"]}"
    Product2
    ^ "{"Attr1":["2013"]}"
    ^ "{"Attr2":["\u041b\u0435\u043d"]}"
    ^ "{"Multy Attr3":["\u041a\u0440\u0430\u0441\u043d\u044b\u0439","\u0421\u0435\u0440\u043e\u0431\u0443\u0440\u044b\u0439"]}"
    Product3
    ^ "{"Attr1":["2015"]}"
    ^ "{"Attr2":["\u041b\u0435\u043d"]}"
    ^ "{"Multy Attr3":["\u0416\u0435\u043b\u0442\u044b\u0439","\u0421\u0438\u043d\u0438\u0439"]}"


    Ровно как хотели.
    Является это хорошим решением? Не факт. Возможно в вашем случае стоит завести readonly виртуальную модель, возможно стоит смотреть в сторону view models и есть еще куча вариантов решения проблемы
    Ответ написан
    Комментировать