• Как получать один объект в разных запросах?

    dzheka3d
    @dzheka3d Автор вопроса
    Пока разбирался, набрел на такую вот проблему...
    Вы писали, что пост должен знать кто его лайкнул... и поэтому в классе Post создаем метод "getLiked", который получает пользователей, которые его лайкнули.
    Но как быть с такой ситуацией...
    Нужно с помощью ajax получить лайкнувших пост, комментарий, фото и т.д.
    У меня только такие мысли... Нужно создать отдельный класс Liked, куда мы будем передавать тип записи и id записи. Например ('posts', 3554) - этим мы говорим, что нужно получить пользователей, которые лайкнули пост с id == 3554.
    И вот тут вопрос возник... В классе Liked мы проверяем что это за тип записи, но дальше не понятно... то ли нужно обращаться к классу Posts, то ли создать класс, который будет получать и обрабатывать лайки от любых записей, будь то posts, comments или photos.
    Получается, что нам не нужно создавать метод getLiked() в классе Post, а только обращаться к классу Liked из класса Post
  • Как вывести код красиво?

    dzheka3d
    @dzheka3d Автор вопроса
    А вот. сделал так и все суппер:
    JSON.stringify(JSON.parse($('code').text()), null, '\t')
  • Как вывести код красиво?

    dzheka3d
    @dzheka3d Автор вопроса
    Да, это скорее всего то, что надо, правда если сделать так:JSON.stringify({"id": 17}, null, '\t');
    А если тоже самое будет в теге code и делать так: JSON.stringify($('code').text(), null, '\t');
    то к каждому параметру с кавычкой просто добавляются слеши. и получается вот это: {\"id\": 17}
  • Как получать один объект в разных запросах?

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

    Извиняюсь за свою тупость... Но читаю книгу 692ae58b5b924c68996ad362fbc5cbc6.jpg
    Все хвалили, купил, а там как бы принципы, методы все вроде понятно объясняют, и я понимаю все по отдельности, но вот как это все соединить и нормально использовать - не получается...

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

    В любом случае, спасибо, что потратили на меня время, я все-таки вроде разобрался, буду пробовать это все на практике...
  • Как получать один объект в разных запросах?

    dzheka3d
    @dzheka3d Автор вопроса
    Спасибо за ответ!
    А что в итоге получает переменная в этой строке?
    $likedPosts = Posts::where('author_id', $user->id)->get()

    Уже готовый список объектов User? Т.е. где-то в методе get() есть обращение к классу User?
  • Как получать один объект в разных запросах?

    dzheka3d
    @dzheka3d Автор вопроса
    Decadal, Ужас, чем дальше в лес, тем больше дров. Но мы как раз и подошли к моему вопросу на примере кода выше, уделите пожалуйста мне еще немного времени...
    Получается в методе selectAllFromUsersTableEtc() мы получаем список всех пользователей?
    Но вот смотрите, например создаю я в классе Posts метод GetUsersLiked(), где получим данные о лайкнувших, там нам нужны только поля (id, firstName, lastName и, предположим, наш location). Значит прямо в методе GetUsersLiked() делаем запрос в БД (Я слышал, что требуется разделять запросы к БД от методов, но мне так проще описать пример, но к тому же я не совсем понимаю зачем их разделять, на практике не потребовалось ни разу, а код получается разбросанным). В общем получается примерно такой класс Posts
    class Posts{
    	
    	public $db;
    	private $users = array();
    	
    	function __construct($db){
    		$this->db = $db;
    	}
    
    	function GetUsersLiked($post_id){
    		
    		$res = $this->db->query("SELECT u.`id`, u.`firstName`, u.`lastName`, u.`country_name`, u.`city_name`
    			FROM `likes_posts` lk
    			INNER_JOIN `users` u ON u.`id` = lk.`user_id`
    			WHERE lk.`post_id` = {$post_id}");
    
    		while($row = $res->fetch_assoc()){
    			// теперь добавляем все полученные результаты в класс User, который и слепит нам объект
    			
    			/*==== вот этот код у нас повторяется с классом UserS ====*/
    			// полагаю, тогда нам нужно вызывать метод addUser() из класса Users, а не сразу обращаться к классу User? 
    			$user = new User($row['id']);
    			
    			$user->firstName = $row['firstName'];
    			$user->lastName  = $row['lastName'];
    			/*============*/
    
    			/*===== Вот тут опять повторяется код, поэтому я и решил, что нужно создать отдельный метод в классе UserS ====*/
    			$locObject = [
    				"city" => $row["city_name"], 
    				"country" => $row["country_name"]
    			];
    			
    			$user->setLocation($locObject);
    			/*===========*/
    			
    			// А тут опять что-то не то, в итоге мы все равно создаем массив юзеров, как и у меня в примере выше
    			$this->users[$id] = $user;		
    		}
    	}
    }


    И вот тут как раз по моему вопросу.... Что теперь делать с этим массивом $this->users?
    Опять его кидать в какой-то класс, который снова будет пробегать по массиву и выводить нужные данные о каждом пользователе? Причем в этом классе прийдется опять создать разные методы, например для вывода лайкнувших (тут ведь только 4 поля нужны), для вывода друзей (тут нужно больше полей) и так далее...
  • Как получать один объект в разных запросах?

    dzheka3d
    @dzheka3d Автор вопроса
    DTX, Спасибо за ответ, чтобы мне не писать везде одно и тоже, гляньте пожалуйста мой ответ Decadal-у
  • Как получать один объект в разных запросах?

    dzheka3d
    @dzheka3d Автор вопроса
    Ну то, что БД никак не связана с ООП это понятно, я просто опустил это в описании. Понятно, что после запроса мы обрабатываем полученные данные в каком-то классе, работающем с пользователями.
    Но как раз тут у меня тупик... Если поля будут разными в разных запросах, то в классе Users мне нужно просто делать проверку на существование того или иного поля? И на сколько я понял по вашему ответу, нужно так и создавать методы со своими запросами к БД в одном классе Users?
    т.е. класс получится примерно таким?
    class Users{
    
       private $users = array(); //записываем данные о полученных юзерах со всех методов
    
       // получаем список лайкнувших пост
       function getUsersLiked($post_id){
          // запрос в БД
       }
    
       // получаем список всех юзеров
       function getAllUsers(){
          // запрос к БД
       }
    
      // получаем список подписчиков какого-то конкретного юзера
      fucntion getFollowers($owner_id){
         // запрос к БД
      }
    
      // ..... и так далее для каждого случая
    
      function showUsers(){
         // Выводим все, что есть в массиве $this->users
         // При этом проверяя существование каждого поля, если его нет - просто не выводим
      }
    
      // .... ну и дальше другие методы вроде соединения каких-то отдельных полей
      // к этим методам будет обращаться метод showUsers()
      function getLocation($user_id){
         return $this->users[$user_id]['country_name'].', '.$this->user[$user_id]['city_name'];
      }
    
    }


    Я правильно понял?
  • Почему текст не обрезается с помощью CSS с использованием flexbox?

    dzheka3d
    @dzheka3d Автор вопроса
    Спасибо, вродь работает... Но это нормальный способ или таки костыль?
  • Можно ли вызвать window.onload несколько раз?

    dzheka3d
    @dzheka3d Автор вопроса
    Егор Живагин: Я делаю это, когда после загрузки страницы нужно запустить какой-то код, который актуален только для этой страницы...
  • Можно ли вызвать window.onload несколько раз?

    dzheka3d
    @dzheka3d Автор вопроса
    Это не сработает, если вставить код в html
  • Хранить или генерировать адрес объявления?

    dzheka3d
    @dzheka3d Автор вопроса
    ThunderCat: Ну да, со странами все более или менее ясно, но как быть с категориями...
    Например адрес предполагает быть таким ( .../bashkortostan/avtomobili/legkovye/honda/honda_domani... )
    У меня в каждой записи в БД для объявлений есть 4 поля, для категорий...
    1-е поле (категория) - avtomobili
    2-е поле (категория) - legkovye
    3-е поле (категория) - honda
    Ну само собой у меня там записаны ID этих самых катгорий....

    Но теперь, мне прдется сделать аж 4 джойна, чтобы собрать категории. И то, не совсем получается, потому что у каких-то вложенность 4 а у каких-то только 2. Поэтому 2 последних джойна будут в таком случае лишними ибо в поле для катгории 3 и 4 будет стоять 0.
  • Хранить или генерировать адрес объявления?

    dzheka3d
    @dzheka3d Автор вопроса
    Да, просто строк в таблице городов 2.3 миллиона...
    Но если добавить город или страну, это никак не затронет старые объявления... единственное, что их затронет, это редактирование города или страны, но это практически незачем...
    Но и изменив название города - на объявления это никак не повлияет, url просто останется со старым названием.
    Проблема в том, что категория не обязательно будет одна, это может быть и подкатегории 3-х уровней, поэтому при генерации списка объявлений мне придется для каждого выбирать дерево категорий в котором оно находится...
  • В каком формате хранить значения разных полей?

    dzheka3d
    @dzheka3d Автор вопроса
    ThunderCat: Ну да, если подумать, то поля типа varchar и не нужны вовсе, кроме заголовка объявления, которое и так в таблице `ads`. Разве что поля Float могут встречаться в таких категориях как "одежда" например размер
  • В каком формате хранить значения разных полей?

    dzheka3d
    @dzheka3d Автор вопроса
    т.е. моя структура подходит и я спокойно могу использовать varchar для поля `fields_value`.`val`?
    Или Вы имеете ввиду, что нужно создать еще одну таблицу именно для текстовых полей?
  • Как вывести товары по дереву категорий?

    dzheka3d
    @dzheka3d Автор вопроса
    d-stream: Тут да, в таком случае цепочку нужно хранить не в самом товаре, а в категории, к которой он привязан, тогда запрос получится:
    SELECT `tovar`.* FROM `tovar`
    LEFT JOIN `category` ON `category`.`id` = `tovar`.`id` 
    WHERE `category`.`path` = '{$cat_id}' OR `category`.`path` LIKE '{$cat_id}-%'

    Выходит просто один лишний JOIN, а при изменении расположения категории придется поменять только её цепочку...
    Во, точно, так и сделаю...
    Мне кажется что в данной ситуации это пока единственный оптимальный вариант как по нагрузке, так и по удобству.
    Спасибо еще раз за помощь... Дали хорошего пинка к размышлениям ;)
  • Как вывести товары по дереву категорий?

    dzheka3d
    @dzheka3d Автор вопроса
    d-stream: Спасибо! Да, с mysql тут проблема... решил таки хранить в каждом товаре путь до категории (1-2-5) и выбирать товары примерно по такому запросу:
    SELECT * FROM `tovar` WHERE `path` = '{$cat_id}' OR `path` LIKE '{$cat_id}-%'

    Надеюсь такой способ имеет право на жизнь