Задать вопрос
  • Почему индексация массива возвращает -1?

    Decadal
    @Decadal
    Вы смотрели значение i? А мы нет
    А оно скорее всего = 0.
    Поэтому в массиве ничего не находит
  • Не могу получить заказ на бирже?

    Decadal
    @Decadal
    jwwwe давайте так: вы не слышали всех людей, которым делали за копейки.
    И я подозреваю, что желания рассказывать "смотри, я платил копейки и мне сделали фигню" особо нет ни у кого, зато про "крутую работающую систему за копейки" рассказать захочет каждый.
  • Почему массив равен не массиву?

    Decadal
    @Decadal
    Negwereth
    хотя погодите. Если бы второй привелся к string, мы бы получили "". И приведение к boolean через "!" сделало бы его true
  • Почему массив равен не массиву?

    Decadal
    @Decadal
    Negwereth, спасибо за замечание, вы правы
  • Как задать sequence PostgreSQl в миграциях Yii2?

    Decadal
    @Decadal
    Сергей Беловенцев всё, что не характерно для всех баз данных вместе взятых, нужно делать вручную. Или, может быть, кто-то написал кастомный класс migration для постгрес, но не знаю, не гуглится.
  • Как соединить два массива?

    Decadal
    @Decadal
    Messi и если одинаковые ключи, то перезатирается последним из значений. В вашем случае ключи одинаковы, просто первый массив ставьте вторым в вызове функции.
    Если вам нужно мерджить так, чтобы применялось не-нулевое значение, придётся написать свой мердж
  • Как объединить результат двух sql запросов?

    Decadal
    @Decadal
    То, ради чего вы хотите так сделать, скорее всего, плохая идея.
    обычного UNION должно было быть достаточно.
  • Как задать имя первичного ключа через миграцию Yii2?

    Decadal
    @Decadal
    вы можете сами задать имя первичному ключу, если укажете его отдельно от миграции создания таблицы (addPrimaryKey)
  • Нужно отсортировать массив, как это лучше сделать?

    Decadal
    @Decadal
    vladimir2209 я без претензий, просто когда ввели сложность для вопросов, стала бросаться в глаза метка middle. А она, по ходу, стандартная. И это раздражает)
  • Как сделать, чтобы работало?

    Decadal
    @Decadal
    в респонсе вам приходит объект.
    Дайте, пожалуйста, структуру этого объекта.
  • Как разобраться с авторизацией в Node.js?

    Decadal
    @Decadal
    evg_96 в таком случае, вам попался неудачный для вас вариант курсов, что ещё раз доказывает, что знания лучше получать не по каким-то методикам, а по мере возникновения вопросов.

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


    кратко про сессии - сервером устанавливается специальный куки (слышали же о печеньках, cookies?), который присылается клиентом в каждом следующем запросе. Сервер берёт присланный куки и смотрит всю информацию, сохранённую ранее для этого куки. Такой куки называется идентификатором сессии, а вся информация, которую сервер помнит о юзере - собственно, сессией. Она нужна чтобы различать авторизованных юзеров и не заставлять их каждый раз вводить логин\пароль.

    Конкретных реализаций я не понял, слишком много кода было и запутано как то все.

    значит, нужно больше времени уделить коду, тут по-другому никак)

    Код выглядт как обычный рутинный код какого-то проекта. Он не похож на код, по которому чему-то учат)
  • Как доработать условие функции?

    Decadal
    @Decadal
    так разве третьего?
    $(".box_in h2")[insert_after]
    это же четвёртый
  • Как получать один объект в разных запросах?

    Decadal
    @Decadal
    Евгений, Я надеюсь, что мой ответ "да" не засядет в голове навечно) В данном случае - да, мы делаем источник однородной информации из класса UserQueries.

    Однако учтите, что это выход в том случае, если вы не используете фреймворки. В фреймворках предложены свои решения этой проблемы, и вам следует ознакомиться и осознанно принять предлагаемое ими решение (типа Active Record yii, или Doctrine из Symfony) или отвергнуть в пользу своего. Плюс, в каких-то проектах уже исторически сложился другой стиль, или другая архитектура - всё это разнообразное, и по-прежнему ООП (или пытается им быть). Вот где сложность, десяток ответов на вопрос - и все по-своему правильные. Ориентируйтесь на конкретную ситуацию: чем больше ситуаций вы увидите, тем больше разнообразных инструментов получите в распоряжение (вернее, поймете их применение).


    А потом из, например, Posts обращаемся к классу UserQueries и получаем лайкнувших, из новостей опять обращаемся к UserQueries и выбираем метод для получения тех, кто поделился и т.д. В итоге, если что-то поменяется в БД с таблице Users, мы всегда сможем внести изменения в одном файле и не париться о том, что где-то еще есть запросы? Я правильно понял? Для этого и нужно разделять логику и запросы к БД?


    Направление мыслей верное, идею вы поняли. Правда, насчет Posts и UserQueries нужно еще немного подумать, вдруг найдёте решение получше)

    Извиняюсь за свою тупость... Но читаю книгу


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

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


    Вы читаете php, да? Так вот: пока вы работаете с php, будьте спокойны: 90% времени выполнения скрипта всё равно сожрёт база данных. И то что какие-то массивы перебираются по два раза, настолько незначительно, насколько незначительны три звезды в космосе.
    Если что-то медленно работает, провисает или тормозит - почти всегда это из-за бд. Чтобы двигаться дальше, пока что просто смиритесь с этим.

    Например:
    есть функция, которая перебирает строку и выводит каждый символ. И есть функция, которая считает количество символов в строке. Вам приходится использовать их две сразу, и тут же вы замечаете, что можно было бы выполнить их в одном проходе цикла: и считать символы, и выводить их. Заманчиво, но во что превратится код? Мы разделяем: сначала посчитаем количество, потом переберем строку. Зачем? Чтобы сделать код сопровождаемым, и да, в ущерб производительности.
    Названия переменных занимают место в оперативной памяти. $userCount занимает в девять раз больше места чем $a. Вы же не будете называть все переменные $a, $b, $c? хотя это и экономия памяти.
  • Как получать один объект в разных запросах?

    Decadal
    @Decadal
    Евгений,

    а код получается разбросанным.

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

    Значит прямо в методе GetUsersLiked() делаем запрос в БД

    и на этом моменте резко выдыхаем, возвращаем все что нам вернула база и перестаём обрабатывать юзера в классе Posts. Никаких дальнейших действий. Никаких юзеров в private поле. Просто остановитесь на этом. Объясню ниже.

    Получается в методе selectAllFromUsersTableEtc() мы получаем список всех пользователей?

    да. Но вы им одним не обойдётесь.
    Выбрать всех пользователей, но с аватарками (хранятся в таблице files с полями file_ext, file_name)?
    Выбрать всех пользователей, но с инфой об их персональных данных (которым стоит храниться отдельно)?
    Выбрать всех пользователей, но вместо first_name и last_name сделать колонку full_name?
    Вы замечаете, что желание из всех запросов сотворить модель new User($результат, $очередного, $безумного, $запроса); выносит мозг?
    А главное - всё это вместе взятое остаётся тем самым юзером, просто упорно не лезет в то ООП, которое вы пытаетесь воссоздать, ну не может везде и всюду быть нужна инфа только из одной таблицы users, или только из posts. Это не удовлетворяет бизнес-потребностям (читайте: не устроит заказчика).

    Вот для этого нужно разделять "место_где_вы_делаете_запросы" от "место_где_вы_обрабатываете_результат".
    Взгляните на код:
    class UserQueries {
       public function getUserWithAvatar($ids = []) {
          $result = $this->db
    ->createCommand("SELECT u.id, u.name, f.name AS avatar_name from users u inner join files f ON f.id = u.avatar_id")->execute();
           //делаем кучу правильных обработок, учитываем что 
    //если $ids не пустой то нужно сформировать WHERE id IN ();
           // возможно кешируем запрос, если он будет часто браться 
          return $result; 
       }
    }
    
    class UsersController() 
    { 
    //список всех юзеров с аватарками
       public function actionIndex() {
          $uq = new UserQueries();
     // сырая инфа из базы!
          $usersList = $uq->getUserWithAvatar(); 
    // пути разошлись! вы можете 1) создать контейнер со всеми чисто-аватарками 
    //и контейнер с чисто-юзерами по отдельности 
    //2) создать контейнер с UsersWithAvatar - да-да, эта фиговина будет хранить модели пользователей с аватарками! 
    // только прочтите правильно: модели (пользователей с аватарками)
    // а не модели пользователей и модели аватарок.
    //"Так это же дублирование..? ведь есть Users, какой еще UsersWithAvatar??" - можете спросить вы, но я отвечу - 
    //светлые головы изобрели наследование для таких моментов, и UsersWithAvatar just extends UsersContainer
    
          return new UserWithAvatarsContainer($usersList); 
          //или, как в фреймворках делается: 
          // return $this->render('index', [ 'dataProvider' => $userWithAvProvider ] );     
       }
    }
    // какая-нибудь вьюха
    //($container это наш $userWithAvContainer)
    $usersWithAv = $container->getAll(/*обычно это делается с пагинацией, а то от 124123242 юзеров всё умрёт*/); 
    
    for ($i = 0, $sz = count($usersWithAv); $i < $sz; $i++) :?>
    
    <?php $current = $usersWithAv[$i]; ?>
    <?= $current->first_name?>    
    <?php endfor;?>


    всё. Где здесь та самая сложность, которую вы пытались воссоздать с помощью ООП? Оно создано для того, чтобы упрощать сложные вещи, а не усложнять простые. Набивайте себе руку чтобы видеть, где какие вещи улучшить, и не улучшайте то, что ещё не выполняет своих задач.
  • Почему не работает код PHP?

    Decadal
    @Decadal
    + ' '? JS-дев в треде, лови его!
    Конкатенация в пхп через точку
  • Как получать один объект в разных запросах?

    Decadal
    @Decadal
    user->posts это скорее все посты которые юзер создал а не лайкнул, как и следует из вашего замечания Posts::where('author_id', user->id) // так какой же он автор поста, он 'лайкер' поста должен был быть?..

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

    Decadal
    @Decadal
    А у вас в profile случайно нет ещё одного гитигнора?
  • Как получать один объект в разных запросах?

    Decadal
    @Decadal
    Евгений

    Ну, окей, тогда немного про ооп.
    Итак: каждый объект класса User (заметьте, не Users) имеет first_name, last_name и прочее. Он у нас называется моделью, а у вас в программе он представлен элементом массива $_users (приватного поля класса Users)
    Что вам нужно знать:
    1) класс User не знает о существовании каких-либо других полей. Он знает только о своих, и будет принимать только свои, только конкретные first_name, last_name.
    2) класс Users, судя по названию, должен отвечать за хранение списка пользователей (т.е. массива объектов User). А значит, он должен умееть добавлять юзеров ( метод addUser ), удалять их (... ну вы поняли), чтобы быть полноценным контейнером. И вот тут самое интересное: именно в метод addUser извне и будут попадать все нужные поля для создания юзера, и тут же должна быть вся проверка, какое поле есть, какого нет, как с этим жить и тд).
    3) вам бы вообще не стоило совмещать выгрузку из базы и хранение данных в одном и том же классе, но это другая история, называемая проблемой ORM.

    И на сколько я понял по вашему ответу, нужно так и создавать методы со своими запросами к БД в одном классе Users?
    т.е. класс получится примерно таким?


    а теперь об этом.
    // получаем список лайкнувших пост
    function getUsersLiked($post_id){
    // запрос в БД
    }

    неправильно. Это пост знает о тех, кто его лайкнул. Эта функция должна быть в классе Posts. User не должен знать о таких вещах, кого он там лайкает. Простая аналогия: вы покупаете что-то в магазине. Это не вы должны запомнить кассира, которому даёте карточку, а кассир должен запомнить, с чьей карточки он принял оплату, потому что ему же потом отчитываться. Так же и посту потом "отчитываться", какие юзеры его лайкнули.

    function showUsers(){
    // Выводим все, что есть в массиве $this->users
    // При этом проверяя существование каждого поля, если его нет - просто не выводим
    }
    // получаем список всех юзеров
    function getAllUsers(){
    // запрос к БД
    }

    Избыточные операции. Мм... на данном этапе всё чем могу помочь - сказать что getAllUsers по задумке должен возвращать то же, что и showUsers, т.е. хотя бы прятать от всего мира тот факт что он загружает данные из базы, и выплевывать уже готовые, обработанные модельки юзеров. Пример:
    function getAllUsers() {
    $usersRecords = $this->dbConnection->selectAllFromUsersTableEtc(); 
    for ($i = 0, $size = count($usersRecords); $i < $size; $i++ ) 
    {
    $currentRec = $usersRecords[$i];
    //that's what i mean when said 'preparing', обработка 
    $location = [ //or $this->formateLoc($currentRec);
    "city" => $currentRec["city_name"], 
    "country" => $currentRec["country_name"]
    ];
    $this->addUser($currentRec['id'], $currentRec["first_name"], $currentRec["last_name"], $location, //...); 
    }
    }
    
    function addUser($id, $firstName, $lastName, $locObject) {
    //check for values
    $user = new User($id); //эх а вот был бы у вас этот класс, а не просто массив...
    $user->firstName = $firstName; 
    $user->lastName = $lastName; 
    if(! isset($locObject["country"]) ) {
    throw new \Exception("Location object is invalid");
    } 
    $user->setLocation($locObject);
    $this->users[$id] = $user; 
    }

    И тогда у вас не будет никаких function getLocation($user_id) у контейнера. Потому что это неправильно. Контейнер должен видеть в юзерах цельные куски инфы, а не выдавать вам фрагмент инфы по одному юзеру. Или отдал всего юзера или ничего.