@Alk90
php, mysql, jquery, css, html, api

Как привязать attachments к постам?

Всем привет! Помогите разобраться, не могу создать полноценный объект поста с изображениями. Весь код в вопросе упрощу на сколько смогу...
Есть контроллер, который вызывает метод getUserPosts модели (PostModel), для получение постов пользователя. Код метода примерно следующий:
function getUserPosts($user_id){
	$res = $this->db->query("SELECT `id`,`title`, `text` FROM `posts` WHERE `user_id` = {$user_id}");
	
	while($row = $res->fetch_assoc()){
		$this->addPostsId($row['id']); // сохраняем id постов, чтобы потом использовать только те ID, с которыми посты получены
		$this->list_posts[] = new PostEntity($row['id'], $row['title'], $row['text']);
	}

	return $this->list_posts;
}

т.е. в контроллере мы получаем массив объектов PostEntity;
теперь нам нужо получить изображения, которые содержит каждый пост и вкинуть их в соответствующий объект, чтобы в конце получить такой json:
"items": [
			{
				"id": 646,
				"title": "Заголовок поста",
				"text": "Содержание поста" 
				"attachments": [
                                   {
                                       "type": "image",
                                       "id": 54645,
                                       "name": "1111111.jpg"
                                    },
                                    {
                                       "type": "image",
                                       "id": 54648,
                                       "name": "2222222.jpg"
                                    }
                                ]
			}
		]


На ум пришло делать так (для экономии запросов к БД): В контроллере вывода постов, после получения постов из выше описанного метода. Обращаться к модели Attachments и получать изображения с помощью метода getImagesFromPostsId($PostModel->getPostsId) (тут мы получим массив ID, которые записывали при выборке в $this->posts_list, и передадим их как ID постов для которых прикреплены изображения). В итоге код на получение изображений будет такой:
function getImagesFromPostsId(array $posts_id){

	$res = $this->db->query("SELECT `id`, `name`, `post_id` FROM `images` WHERE `post_id` IN (".implode(',', $posts_id).")");
	
	while($row = $res->fetch_assoc()){

		$this->list_images[] = new ImageEntity($row['id'], $row['name'], $row['post_id']);
	}

	return $this->list_images;

}


В итоге мы получим все изображения, которые есть в выбранных выше постах. Но как теперь связать это все вместе? Например, проходим циклом по массиву $Attachments->list_images, получаем в каждом цикле ID поста, к которому нужно привязать объект изображения, но как теперь найти этот самый объект нужного нам поста?

Может я пошел не по правильному пути изначально? Поправьте плз, если так... Может есть менее запутанный алгоритм? Может видите какие-то подводные камни?
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
AlexMcArrow
@AlexMcArrow
Люблю РНР, да я такой!
Я хочу предложить вам JOIN в первом SELECT`е и сразу получить не только сообщения но и аттачи, а дальше перебором одного массива собрать нужную структуру.
Не спорю, что результат такого запроса будет содержать избыточные данные.

Второй вариант - тоже JOIN в первом SELECT`е но с группировкой по `posts`.`id` и GROUP_CONCAT (`images`.`id`, ':', `images`.`name`) - так вы получите сразу, только уникальные строки постов, а дополнительном поле у вас будет строка с перечнем аттачей (которые потом можно преобразовать - через explode - в массив)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы