• Где лучше всего добавлять дополнительные данные к запросу?

    @Kostik_1993
    Web Developer
    Ни обсервер, ни запрос тут вообще не нужны.
    В вашем случае всеми данными управляет бизнес логика в том месте где она выполняется. Если опустить все принципы разработки, то условным местом выполнения будет метод контроллера. Ну или тот бизнесовый класс который он вызовет, что более правильно. Представляю работать с кодом после вас, захожу я, прописываю тот статус который требуется в новой задаче, а он все равно ставится какой-то иной и начинаю я искать, а куда же его изменение засунул Алексей Скляров
    Ответ написан
    Комментировать
  • Как реализовать систему акций в интернет магазине?

    glaphire
    @glaphire
    PHP developer
    Вряд ли есть готовый пакет, разве что готовый магазин на ларавеле)
    Как черновик можно набросать схему бд:
    product
    category
    sale
    sale_category
    sale_product

    А sale описать как:
    id
    name
    type (fixed, percent, formula)
    value
    start (datetime)
    end (datetime)

    И запилить сервис, который будет по категории или продукту проверять наличие скидок на него и высчитывать итоговую цену. Просто надо описать все сценарии вычисления скидок словесно, и по итогу класс-сервис легче будет декомпозировать
    Ответ написан
    1 комментарий
  • Как безопасно отправлять пользовательский текст в базу POST запросом?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Перед тем как что-то куда-то добавлять надо сначала разобраться что ты делаешь.
    В частности понять что браузер, веб-сервер, и база данных - это разные вещи, и для каждой нужна своя обработка данных.

    В-первых, POST запросом ничего добавить в базу нельзя.
    База вообще ничего не знает про пост запросы. POST запросом можно отправить текст только в РНР.
    А РНР уже будет добавлять в БД.

    Про HTML база данных тоже ничего не знает. Поэтому "htmlspecialchars" к базе данных не имеет никакого отношения. И делать это для добавления в БД не нужно. Это функцию надо применять при выводе данных в браузер, а не при сохранении в базу данных.

    Вот теперь, когда мы разобрались что у нас где, можно наконец ответить на твой вопрос

    Для безопасного добавления данных в БД из РНР, надо отправлять их отдельно от самого запроса. Это непреложное правило, которое надо соблюдать всегда.
    И не важно - пользовательский у тебя текст, или какой-то другой, POST у тебя запрос, или вообще никакого запроса не было - все эти вещи к работе с БД из РНР не имеют никакого отношения. Важно только то, что данные всегда отправляются в БД отдельно от запроса.
    Для этого надо
    • Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
    • Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса stmt, с которым в дальнейшем и производятся все манипуляции
    • Привязать переменные к запросу.
    • Выполнить подготовленный ранее запрос с помощью с помощью execute()

    В mysqli это будет так
    $sql = "INSERT INTO  table (name, text, message, date, rating) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->bind_param("sssss", $name, $text, $message, $date);
    $stmt->execute();

    bind_param() принимает в качестве параметров все переменные, которые должны попасть в запрос, в том же самом порядке, в котором стоят плейсхолдеры в запросе. Но кроме того, сначала в этой функции должны быть указаны типы для всех переменных, в виде строки, где тип переменной обозначается одной буквой. То есть букв в этой строке должно быть ровно столько, сколько дальше будет переменных. К счастью, можно особо не париться с типами и для всех переменных указывать тип "s".

    Но по-хорошему для работы с БД в РНР лучше использовать PDO, Тем более что там колупаться с bind_param не нужно, а можно сразу отправить все данные в execute
    $sql = "INSERT INTO  table (name, text, message, date, rating) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->execute([$name, $text, $message, $date]);

    А дураков, которые сами не знают, как текст в базу сохранить, слушать не надо.
    Ответ написан
    Комментировать
  • Carbon, как к одной дате выведенной из базы прибавить другую?

    Fernus
    @Fernus
    Техник - Механик :)
    1. Работа с Carbon;
    2. Если создадите модель и укажите для этого поля, что оно - дата (подробнее), то можно будет делать по Вашей схеме, как и хотели...
    Ответ написан
    Комментировать
  • Как отправить форму после длительного бездействия?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    Можно использовать специально для таких целей сделанный пакет GeneaLabs/laravel-caffeine. Он добавляет на страницу скрипт, который через определённый интервал пинает бэкенд и продлевает сессию.
    Ответ написан
    Комментировать
  • Как правильно связать несколько таблиц?

    @Nc_Soft
    <?php
    $model = \App\Models\Building::where('id', 1)->with('street.settlement.subregion.region.country')->first();
    echo $model->address;

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Building extends Model
    {
        public function street()
        {
            return $this->belongsTo('App\Models\Street');
        }
    
        public function getAddressAttribute()
        {
            $parts = [
                $this->street->settlement->subregion->region->country->title,
                $this->street->settlement->subregion->region->title,
                $this->street->settlement->subregion->title,
                $this->street->settlement->title,
                $this->street->title,
                $this->title,
            ];
            return join(', ', $parts);
        }
    }


    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Street extends Model
    {
        public function settlement()
        {
            return $this->belongsTo('App\Models\Settlement');
        }
    }


    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Settlement extends Model
    {
        public function subregion()
        {
            return $this->belongsTo('App\Models\Subregion');
        }
    }


    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Subregion extends Model
    {
        public function region()
        {
            return $this->belongsTo('App\Models\Region');
        }
    }


    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Region extends Model
    {
        public function country()
        {
            return $this->belongsTo('App\Models\Country');
        }
    }


    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Country extends Model
    {
    
    }


    DROP TABLE IF EXISTS `buildings`;
    CREATE TABLE `buildings` (
      `id` bigint unsigned NOT NULL AUTO_INCREMENT,
      `street_id` int DEFAULT NULL,
      `title` varchar(255) COLLATE utf8mb4_ru_0900_ai_ci DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `id` (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_ru_0900_ai_ci;
    
    DROP TABLE IF EXISTS `countries`;
    CREATE TABLE `countries` (
      `id` bigint unsigned NOT NULL AUTO_INCREMENT,
      `title` varchar(255) COLLATE utf8mb4_ru_0900_ai_ci DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `id` (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_ru_0900_ai_ci;
    
    DROP TABLE IF EXISTS `regions`;
    CREATE TABLE `regions` (
      `id` bigint unsigned NOT NULL AUTO_INCREMENT,
      `country_id` int DEFAULT NULL,
      `title` varchar(255) COLLATE utf8mb4_ru_0900_ai_ci DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `id` (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_ru_0900_ai_ci;
    
    DROP TABLE IF EXISTS `settlements`;
    CREATE TABLE `settlements` (
      `id` bigint unsigned NOT NULL AUTO_INCREMENT,
      `subregion_id` int DEFAULT NULL,
      `title` varchar(255) COLLATE utf8mb4_ru_0900_ai_ci DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `id` (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_ru_0900_ai_ci;
    
    DROP TABLE IF EXISTS `streets`;
    CREATE TABLE `streets` (
      `id` bigint unsigned NOT NULL AUTO_INCREMENT,
      `settlement_id` int DEFAULT NULL,
      `title` varchar(255) COLLATE utf8mb4_ru_0900_ai_ci DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `id` (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_ru_0900_ai_ci;
    
    DROP TABLE IF EXISTS `subregions`;
    CREATE TABLE `subregions` (
      `id` bigint unsigned NOT NULL AUTO_INCREMENT,
      `region_id` int DEFAULT NULL,
      `title` varchar(255) COLLATE utf8mb4_ru_0900_ai_ci DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `id` (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_ru_0900_ai_ci;
    
    INSERT INTO `buildings` (`id`, `street_id`, `title`) VALUES
    ('1', '1', '43');
    
    INSERT INTO `countries` (`id`, `title`) VALUES
    ('1', 'Российская Федерация');
    
    INSERT INTO `regions` (`id`, `country_id`, `title`) VALUES
    ('1', '1', 'Алтайский край');
    
    INSERT INTO `settlements` (`id`, `subregion_id`, `title`) VALUES
    ('1', '1', 'г. Барнаул');
    
    INSERT INTO `streets` (`id`, `settlement_id`, `title`) VALUES
    ('1', '1', 'ул. Пушкина');
    
    INSERT INTO `subregions` (`id`, `region_id`, `title`) VALUES
    ('1', '1', 'Алтайский район');
    Ответ написан
    3 комментария
  • Как правильно обнавить данные laravel?

    @kandrash
    Кратко о себе
    Ставлю доллар что в массиве fillable не прописаны name и email. Оттого они и не обновляются. Ну и как вам выше указали - вызов save тут лишний. Update достаточно.
    Ответ написан
    1 комментарий
  • Как лучше сделать админку в проекте на Laravel?

    Sanes
    @Sanes
    3) Ничего не использовать, написать самому с нуля.

    Если беретесь делать на фреймворках, то наверняка у вас нетипичная задача.
    Подгонять под задачу готовую админку вряд ли будет быстрей и проще.
    Ответ написан
    Комментировать
  • Как получить самые продаваемые товары Laravel?

    Lyrium
    @Lyrium
    Web developer
    Добрый день, добавьте сортировку в нужном для вас порядке.

    $bestProductIds = Order::get()->map->products->flatten()->map->pivot->mapTogroups(function ($pivot) {
                return [$pivot->product_id => $pivot->count];
            })->map->sum()->sortDesc()->take(3)->keys()->toArray();
            
            $bestProductIdsStr = implode(',', $bestProductIds);
            $bestProducts = Product::whereIn('id', $bestProductIds)
                ->orderByRaw(DB::raw("FIELD(id, $bestProductIdsStr)"))
                ->get();
    Ответ написан
    1 комментарий
  • Как поменять поле, которое проверяется в условии ларавель?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Зачем тебе active в принципе? Почему ты в выборках не можешь просто юзать updated_at где тебе нужно? Судя по тому, что ты задаешь этот вопрос, никаких причин нет.
    Ответ написан
    3 комментария
  • Как на Laravel делать приложения с формочками и CRUD операциями?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    – Кастомизация дефолтных стабов
    https://github.com/laravel-shift/blueprint
    – Кастомные команды для artisan, которые автоматизируют многие шаги
    – Кастомные пакеты которые берут на себя heavy lifting и предоставляют удобный API для работы

    Вы же программист. Фреймворк – это не жесткие рамки, в которые вас зажимают. Это гибкая основа, на базе которой вы строите ровно то, что вам нужно. Так, как вам удобнее.
    Ответ написан
    Комментировать
  • Как передавать Post запрос на другой сайт с параметрами?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Laravel 7:
    Http::post('https://example.com/endpoint', [
        'param' => 'value',
    ]);
    Ответ написан
    Комментировать
  • Можно ли в уже сформированном query в laravel удалить одно where?

    JhaoDa
    @JhaoDa
    LaravelRUS Team
    Надо изучать РНР.
    $query = \DB::table('official')->where(...)->where(...);
    
    $first = (clone $query)->where('date', '2020-03-13')->get();
    $second = (clone $query)->where('date', '2020-03-14')->get();
    Ответ написан
    Комментировать
  • Как мне загрузить файл к себе в storage с другого сайта по ссылке на Laravel?

    glaphire
    @glaphire
    PHP developer
    Решение есть, вопрос нужно разбить на составляющие, чтобы его найти.
    1) Загрузить файл по ссылке - тут несколько вариантов решения - stackoverflow
    2) Сохранить файл в storage на laravel - документация
    На laracasts форуме такое обсуждали - ссылка
    Ответ написан
    Комментировать
  • Как сделать поиск по дву полям?

    @NubasLol
    foreach (explode(' ', $query) as $search) {
        $q->where(function($q) use ($search) {
            $q
                ->where('last_name', 'ilike', "%$search%")
                ->orWhere('first_name', 'ilike', "%$search%")
    
        });
    }
    Ответ написан
    Комментировать
  • Как исключить пропсы из списка?

    yarkov
    @yarkov Куратор тега Vue.js
    Помог ответ? Отметь решением.
    <component v-bind="props"></component>

    computed: {
        props () {
            const {ненужный_проп, ...props} = this.$props;
            return props;
        }
    }
    Ответ написан
  • Как получить доступ к полю в тесте из Resource?

    @NubasLol
    $response->json('data')['hasFiles']
    Ответ написан
    Комментировать
  • Стоит ли использовать z-song/laravel-admin?

    Kulaxyz
    @Kulaxyz
    Могу лучше
    Советую Backpack. Работал с разными панелями, вроде Voyager, Laravel-Nove и свою писал на основе Admin LTE. Backpack для меня оказался наиболее удобным, с подробной документацией и множеством доп пакетов.
    Ответ написан
    Комментировать