За последние 24 часа нас посетили 22804 программиста и 1211 роботов. Сейчас ищут 656 программистов ...

Как получить логин пользователя из другой таблицы(один ко многим)?

Тема в разделе "PHP для новичков", создана пользователем GTank, 9 сен 2018.

Метки:
  1. GTank

    GTank Новичок

    С нами с:
    21 июл 2018
    Сообщения:
    31
    Симпатии:
    1
    Есть таблица users и таблица comments. Во вторю записывается id пользователя, который оставил комментарий. Хочу по этому id получить логин пользователя из таблицы users и вывести в фронте, но не понимаю как правильно составить запрос в БД.

    Я так понимаю нужна связь один ко многим. Кажется у меня получилось связать таблицы, но я не уверен =) Посмотрите:
    Код (Text):
    1.  
    2. --
    3. -- Ограничения внешнего ключа таблицы `comments`
    4. --
    5. ALTER TABLE `comments`
    6.   ADD CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`);
    7. COMMIT;
    [​IMG]

    Структура таблицы users:
    PHP:
    1. CREATE TABLE `users` (
    2.   `id` int(11) NOT NULL,
    3.   `login` varchar(255) NOT NULL,
    4.   `email` varchar(255) NOT NULL,
    5.   `password` varchar(255) NOT NULL,
    6.   `token` varchar(255) NOT NULL,
    7.   `status` int(11) NOT NULL,
    8.   `role` varchar(255) NOT NULL
    9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    Структура таблицы comments:
    PHP:
    1. CREATE TABLE `comments` (
    2.   `id` int(11) NOT NULL,
    3.   `user_id` int(11) NOT NULL,
    4.   `article_id` int(11) NOT NULL,
    5.   `reply_id` int(11) NOT NULL,
    6.   `message` text NOT NULL
    7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
  2. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @GTank, гугли mysql join
     
  3. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    PHP:
    1. $query = $db->prepare('SELECT
    2.    `users`.`id`, `users`.`login` AS `ulogin`,
    3.    `comments`.`id`, `comments`.`user_id`
    4. FROM `users`
    5. RIGHT JOIN `comments`
    6. ON (`users`.`id` = `comments`.`user_id`)
    7. WHERE `users`.`id` = ?');
    8. $query = $db->execute([(int) $session_userID]);
    9. $result = $query->fetch();
    10.  
    11. echo $result['ulogin'];
    12. var_dump($result);
    $session_userID - это id пользователя хранящее в сессии
    $db - это подключения к базе
    В ON() - проверяешь чтобы id из табл. users было равно user_id из табл. comments.
    А вообще тебе нужен только запрос, возьми скопируй запрос:
    PHP:
    1. SELECT
    2.     `users`.`id`, `users`.`login` AS `ulogin`
    3.     `comments`.`id`, `comments`.`user_id`
    4. FROM `users`
    5. RIGHT JOIN `comments`
    6. ON (`users`.`id` = `comments`.`user_id`)
    7. WHERE `users`.`id` = ?
    и вставь его в базу проверь придет ли логин пользователя.
    Вместо знака ? поставь id пользователя который писал коммент.
     
    #3 _ne_scaju_, 9 сен 2018
    Последнее редактирование: 9 сен 2018
  4. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
  5. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    почему не лефт изменил на RIGHT JOIN
     
  6. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    вот шпаргалка
     

    Вложения:

  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    @_ne_scaju_, а почему ты users джоинишь с comments, а не наоборот? Ведь ТС хочет список комментариев получить, а к ним подставить имена пользователей.
     
    MouseZver нравится это.
  8. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    а что разве не сработает так? я думал без разницы главное сравнить id не важно с какой стороны и все :D
    --- Добавлено ---
    мне шпаргалка не понравилась, полная туфта.
     
  9. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @_ne_scaju_, там на картинке всё яснопонятно, что к кому присоединяется и что будет включено в результат.
     
  10. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    она не качественная :D
     
  11. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    SQL как-то по барабану нравится она тебе или нет
    --- Добавлено ---
    нарисуй качественную, хотя с "я думал без разницы главное сравнить id не важно с какой стороны и все" у тебя всё шансы Малевича с его квадратом переплюнуть.
     
  12. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @Valick, действительно, для переносимости же принято использовать LEFT JOIN.

    @_ne_scaju_, лучше помалкивай, у тебя вообще кросс :)
     
  13. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @miketomlin, тогда пусть таблицы местами поменяет
     
  14. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @GTank, жестко можно не привязывать, на тип связывания это не влияет.
     
  15. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    это почему?
     
  16. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @Valick, а, понятно.
    --- Добавлено ---
    Технично исправился. Получилось, как будто мы все тут бараны кроме тебя :)
     
  17. GTank

    GTank Новичок

    С нами с:
    21 июл 2018
    Сообщения:
    31
    Симпатии:
    1
    О_о сколько ответов. Спасибо всем. У меня получилось вот так:
    PHP:
    1. public function getUser(){
    2.  
    3.     $params = [
    4.         'user_id' => 2,
    5.     ];
    6.  
    7.     return $this->db->all("SELECT user_id, login, message FROM comments LEFT JOIN users ON comments.user_id = user_id",$params);
    8. }
    В БД 2-е записи этого пользователя. Результат выборки:
    PHP:
    1. (
    2.     [0] => Array
    3.         (
    4.             [user_id] => 2
    5.             [login] => Login
    6.             [message] => 2222222222222222222222222222
    7.         )
    8.  
    9.     [1] => Array
    10.         (
    11.             [user_id] => 2
    12.             [login] => Login
    13.             [message] => 3333333333333333333333333333333
    14.         )
    15.  
    16. )
    В фронтенде тоже всё ок:
    Login

    2222222222222222222222222222

    Login

    3333333333333333333333333333333


    _ne_scaju_
    Завтра просмотрю еще раз твой пост и если что-то не правильно - перепишу. Сегодня просто уже времени нет =) Если завтра у меня вопросов не будет то вопрос можно считать решенным.
     
  18. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @_ne_scaju_, потому, что JOIN без указания равнозначен запятой - это перекрёстное обединение таблиц и дай бог чтоб WHERE помог, поэтому всегда надо явно указывать какая таблица к какой присоединяется, для этого даже FULL OUTER есть, чтобы всем рассказать, что программист в курсе что он получит на выходе.
     
  19. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @GTank, getUser какое отношение имеет к этому?
     
  20. GTank

    GTank Новичок

    С нами с:
    21 июл 2018
    Сообщения:
    31
    Симпатии:
    1
  21. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @GTank, ок, я записал, в следующий раз сначала подождём, что у тебя получилось, потом будем заваливать советами ;)
     
  22. GTank

    GTank Новичок

    С нами с:
    21 июл 2018
    Сообщения:
    31
    Симпатии:
    1
    Это метод в моей моделе, который потом вызывается в контроллере =)

    Модель
    PHP:
    1. <?php
    2.  
    3. namespace app\models;
    4.  
    5. use components\engine\base\Model;
    6.  
    7. class Main extends Model
    8. {
    9.  
    10.     public function getUser(){
    11.  
    12.         $params = [
    13.             'user_id' => 2,
    14.         ];
    15.  
    16.         return $this->db->all("SELECT user_id, login, message FROM comments LEFT JOIN users ON comments.user_id = user_id",$params);
    17.     }
    18. }

    Контроллер:

    PHP:
    1. <?php
    2.  
    3. namespace app\controllers;
    4.  
    5. use app\models\Main;
    6.  
    7. class MainController extends AppController
    8. {
    9.     public function indexAction()
    10.     {
    11.  
    12.         $main = new Main();
    13.  
    14.         $test = $main->getUser();
    15.  
    16.         $this->set(compact('test'));
    17.     }
    18.  
    19.  
    20. }
    --- Добавлено ---
    Отлично :D
     
  23. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Возможно. Но можно и забить. Просто запомни: нужно присоединить метаданные по id – LEFT JOIN.
    --- Добавлено ---
    Название нелогичное, говорю.
     
    GTank нравится это.
  24. GTank

    GTank Новичок

    С нами с:
    21 июл 2018
    Сообщения:
    31
    Симпатии:
    1
    А как вообще логично? В принципе как методы именовать?
     
  25. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    getUserID
    getUserName
    getUserComment