• В laravel view функция render для массива?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Как бы если вам надо обработать массив - вам некуда не деться от того или иного обхода этого массива. Не вопрос вы можете сделать:

    $result = '';
    foreach ($comments as $comment){
        $result .= view('comment')->with('comment', $comment)->render();
    }


    но если вы сделаете свой вариант с доп.вьюхой а откроете папку compiled куда ларка складывает скомпилированные вьюхи - вы увидите ровно тот же код.
    Ответ написан
    2 комментария
  • Умножить один столбец на другой, а затем вывести сумму?

    iMedved2009
    @iMedved2009
    Не люблю людей
    SELECT SUM(сount_v * price) FROM table;
    Ответ написан
    Комментировать
  • Как правильно настроить chmod для laravel?

    если зайти на сайт, то я так понимаю создается новый файл кеша с правами которые не позволяют уже удалить этот файл, почему такое происходит и как мне с этим бороться?
    Это значит, что у вас веб-сервер, скорее всего, работает от рута.

    Дождитесь когда файл снова создастся и выполните ls -l bootstrap/cache - увидите, из-под какого пользователя работает веб-сервер.
    Ответ написан
  • Как правильно проверять находится ли пост в закладках пользователя?

    Fernus
    @Fernus
    Техник - Механик :)
    В модели постов нужно добавить отношение с привязкой к юзерам, которые их добавили...в моём коде это bookmark_users...

    <?php
    
    $CURRENT_USER_ID = \Auth::user()->id;
    
    $posts = Post::with([
        'bookmark_users' => function($q) use($CURRENT_USER_ID) {
                $q->where('id', $CURRENT_USER_ID);
            }
        ])
        ->get();
    
    foreach ($posts as $item) {
        
        if($item->bookmark_users->count() > 0) {
            
            // Удалить
            
        }else{
            
            // Добавить
            
        }
        
    }
    Ответ написан
    2 комментария
  • Route Parameters для нескольких контроллеров?

    @Kostik_1993
    Web Developer
    В вашем случае сам по себе Фреймворк бессилен. С этого момента начинается работа над архитектурой приложения. Для решения вашей задачи без использования каких-либо примесей в адресе единственным правильным и универсальным решением будет создание дополнительной таблицы которая будет содержать в себе префикс адреса, тип записи и ее id
    Для осуществления данной затеи смотрите полиморфные связи
    Роут у вас будет один, также и контроллер нужно создать который и будет заниматься обработкой
    Ответ написан
    Комментировать
  • Можно ли спарсить Json с не экранированными кавычками?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Можно попробовать исправить поломанный JSON.
    Примерно так, но это не покрывает 100% случаев из вашего вопроса
    <?php
    $str = '{"name": "my "name"", "value": "123456789"}';
    
    function fixJSON($str) {
        $len = strlen($str);
        $result = '';
        $space = '';
        $mode = 0;
        for($i=0;$i<$len;$i++){
            $c = $str[$i];
            switch ($mode) {
                case 0: //вне строки
                    if ($c == '"') $mode = 1;
                    $result .= $c;
                    break;
                case 1: //внутри строки
                    if ($c == '"') {
                        $mode = 3;
                        $space = $c;
                        break;
                    }
                    if ($c == '\\') $mode = 2;
                    $result .= $c;
                    break;
                case 2: //сразу после слеша (игнорим один любой символ)
                    $mode = 1;
                    $result .= $c;
                    break;
                case 3: //была кавычка внутри строки
                    if ($c == ' ' || $c == '\n' || $c == '\t' || $c == '\r')
                        $space .= $c;
                    elseif ($c == ',' || $c == '}' || $c == ']' || $c == ':') {
                        //вероятно был конец строки (шанс 99%)
                        $mode = 0;
                        $result .= $space.$c;
                    } else {
                        //мы остались внутри строки на 100%. Экранируем
                        $mode = 1;
                        $result .= '\\'.$space;
                        $i--; //уходим назад, т.к. вдруг это снова кавычка
                    }
                    break;
            }
        }
        return $result;
    }
    
    echo(fixJSON($str)); //{"name": "my \"name\"", "value": "123456789"}
    ?>

    Но лучше исправить то место, которое приводит к поломке JSON, чтобы оттуда к вам сразу нормальные строки приходили, а не костыли изобретать.

    P.S.
    Более совершенный и более упоротый вариант
    <?php
    $str = '{"say": ""my name", hi", "value": "123456789"}';
    
    function fixJSON($str) {
        $len = strlen($str);
        $result = '';
        $space = '';
        $mode = 0;
        for($i=0;$i<$len;$i++){
            $c = $str[$i];
            switch ($mode) {
                case 0: //вне строки
                    if ($c == '"') $mode = 1;
                    $result .= $c;
                    break;
                case 1: //внутри строки
                    if ($c == '"') {
                        $mode = 3;
                        $space = $c;
                        break;
                    }
                    if ($c == '\\') $mode = 2;
                    $result .= $c;
                    break;
                case 2: //сразу после слеша (игнорим один любой символ)
                    $mode = 1;
                    $result .= $c;
                    break;
                case 3: //была кавычка внутри строки
                    if ($c == ' ' || $c == '\n' || $c == '\t' || $c == '\r')
                        $space .= $c;
                    elseif ($c == '}' || $c == ']') {
                        //вероятно был конец строки (шанс 99%)
                        $mode = 4;
                        $space .= $c;
                    }
                    elseif ($c == ',' || $c == ':') {
                        //вероятно был конец строки (шанс 90%)
                        $mode = 5;
                        $space .= $c;
                    } else {
                        //мы остались внутри строки на 100%. Экранируем
                        $mode = 1;
                        $result .= '\\'.$space;
                        $i--; //уходим назад, т.к. вдруг это снова кавычка
                    }
                    break;
                case 4: //после спец символа
                    if ($c == ' ' || $c == '\n' || $c == '\t' || $c == '\r')
                        $space .= $c;
                    elseif ($c == ',') {
                        //был конец строки с шансом 99.99%
                        $mode = 0;
                        $result .= $space.$c;
                    } else {
                        //внтури строки на 100%
                        $mode = 1;
                        $result .= '\\'.$space;
                        $i--;
                    }
                    break;
                case 5: //после запятой
                    if ($c == ' ' || $c == '\n' || $c == '\t' || $c == '\r')
                        $space .= $c;
                    elseif (preg_match('/[0-9"-]+/', $c)) {
                        //был конец строки с шансом 99.9%
                        $mode = 0;
                        $result .= $space;
                        $i--;
                    } else {
                        //внтури строки на 100%
                        $mode = 1;
                        $result .= '\\'.$space;
                        $i--;
                    }
                    break;
            }
        }
        if ($mode>2) $result .= $space;
        return $result;
    }
    
    echo(fixJSON($str)); //{"say": "\"my name\", hi", "value": "123456789"}
    ?>
    Но всегда можно в строку засунуть другой JSON и никакой конечный фиксер не справится с такой глубиной.
    Ответ написан
    Комментировать
  • Можно ли спарсить Json с не экранированными кавычками?

    TommyV888
    @TommyV888 Куратор тега PHP
    -
    Можно регулярным выражением заменить кавычки, но отталкиваться придется от символов json синтаксиса, а значит если они будут в тексте, то будут ошибки. Этот способ подойдет только если вы уверены что там просто текст, или вас устраивает тот процент ошибок, что вы получите.
    Ответ написан
    Комментировать
  • Как заменить whereHas, ибо он слишком медленный?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    whereHas делает обычный exists. Он даже и близко не медленный. Проблема в отсутствии индексов (на categories.name и в колонках, связывающих две таблицы).
    Ответ написан
    2 комментария
  • Как заменить whereHas, ибо он слишком медленный?

    @Kostik_1993
    Web Developer
    Если подумать, то лучше два простых и быстрых запросов чем один тяжелый.
    В любом случае я думаю категория/ии вам в шаблоне отдельно все равно где-то понадобятся, значит можно сначала получить ее/их по имени, а затем получить статьи

    $categories = Category::whereName($name)->get();
    $articles = Article:with('types')->whereIn('id', $categories->pluck('id'))->paginate(10);


    Если же вы настаиваете на одном запросе, вам придется использовать Join-ы, что также плохо скажется на производительности
    Ответ написан
    Комментировать
  • Слабый процессор для сервера под изображения?

    opium
    @opium
    Просто люблю качественно работать
    Не имеет, картинки будут ок раздаваться, обычно просто у таких сервера канал сто мегабит
    Ответ написан
    Комментировать
  • Слабый процессор для сервера под изображения?

    Для статики, более чем подойдет. Загрузка там минимальна, если конечно не на колхозите.
    Если все будет в памяти, то можно использовать даже HDD, все будет летать.

    Используйте Nginx и open_file_cache, для динамики fastcgi_cache, но я так понял что это уже лишнее.

    Ну и не забываем проверять, какую нагрузку выдержит сервер:
    apt install -y apache2utils
    ab -n 100 -c 10 https://mysite.ru/pict.jpg
    -n - количество запросов
    -с - количество параллельных запросов
    Ответ написан
    Комментировать
  • Как заблокировать одновременное редактирование записи в БД на laravel?

    hePPer
    @hePPer
    можно попробовать обойтись без блокировки, если ситуация не очень частая.
    давать нескольким юзерам возможность получить запись для изменения, при этом добавить в таблицу поле времяИзменения - куда заносить время последней модификации строки. при внесение в базу изменений проверять ключ обновляемой записи и время модификации (update .... where id=1 and lastEdit='lasteditdate'). если время модификации не совпало - то сообщить юзеру что запись которую он редактирует уже изменена кем то и показать ему новые изменения.
    Ответ написан
    Комментировать
  • Какой тип отношений тут нужен?

    @miki131
    Во первых, мне кажется, что вам не нужна модель FavoriteList. У вас связь ManyToMany между Userи Article.
    Также я бы добавил связь ManyToMany между Article и User для учета голосующих и добавил pivot
    class Article
    {
    	public function voters()
    	{
    		  return $this->belongsToMany('App\Models\User')->withPivot('score');
    	}
    }

    Ну и грузил список вот так
    $user
    	->with(['favorite', 'favorite' => function($query) use ($user) {
    		$query
    			->with('voters')
    			->where('user_id', $user->id);
    	}])
    Ответ написан
    Комментировать
  • Какой тип отношений тут нужен?

    Antonchik
    @Antonchik
    Программирую на HTML
    Class FavoritesList()
    {
        public function articleRatingLog()
        {   
            // Нужно указать несколько ключей для корректной связи
            // На обратной стороне также
             return $this->hasOne('App\ArticleRatingLog', ['user_id', 'article_id'], ['user_id', 'article_id']);
        }
    }

    Потом получать так:
    $user->favoriteList[$index]->articleRatingLog->score;
    Ответ написан
    Комментировать
  • Как сделать лимит действий?

    В laravel есть готовый middleware для этого - throttle. Подключите его и настройте как надо.

    В роут добавьте 'middleware' => 'throttle:1,5' 1 - сколько раз, 5 - сколько минут таймаут
    Ответ написан
    Комментировать
  • Как получить список всех пользователей, кто писал комментарий к статье?

    @windsteppy
    Trainee разработчик
    Для начала - структура базы данных:
    Comment (article_id, id, text, user_id)
    Article (id, text, user_id)
    User (id, name)


    Теперь модели:
    Article.php
    public function comments(){
    return $this->hasMany(Comment::class);
    }
    public function author(){
    return $this->belongsTo(User::class);
    }
    public function commetators(){
    return $this->hasManyThrough(User::class, Comment::class);

    Comment.php
    public function article(){
    return $this->belongsTo(Article::class);
    }
    public function user(){
    return $this->belongsTo(User::class);
    }


    Код для поиска всех пользователей, кто писал комментарии к статье.
    $users = Article::find(1)->commentators;
    Ответ написан
    Комментировать
  • Влияет ли место расположение меню для сео?

    RotgarSett
    @RotgarSett
    SEO Эксперт
    Безусловно повлияет. Чем ниже ссылка, тем меньше веса внутри сайта она передает. То есть если расположить смылку на раздел внизу, то его внутреннте страницы с меньшей вероятностью попадут в топ поиска, чем если разместить раздел в верхнем меню.
    Ответ написан
    Комментировать
  • Изменить стиль для родителя?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В CSS нет селекторов для выбора родительских элементов.
    Ответ написан
    Комментировать
  • Изменить стиль для родителя?

    Почему бы дивам с изображениями не присвоить отдельный класс, например - content-img?

    С помощью css найти все дивы с изображениями и изменить им стиль не получиться.
    Ответ написан
    Комментировать
  • Какой тип отношений использовать в данном случае?

    netrox
    @netrox
    return $this->belongsToMany(
        		Article::class,
        		'article_related',
        		'article_id',
        		'related_id'
        	);
    Ответ написан
    Комментировать