Как получить ID поля из разных таблиц? - Дизайн и модификация Invision Power Board

Перейти к содержимому

 

СвернутьПрикрепленные теги

Теги не найдены

Страница 1 из 1

Как получить ID поля из разных таблиц?

#1 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 622
  • Регистрация: 16-Январь 18
  • Репутация: 7
  • Откуда:Спасск-Дальний
  • IPB version:4.1.x
 

Отправлено 12 Июнь 2019 - 07:18

Здравствуйте, мне нужно реализовать следующую задачу, подскажите логикой:

Есть таблица с банами, http://prntscr.com/o0qm0a мне нужно узнать ID игры в которой был забанен человек.

У нас есть поля gamename и datetime, которые нужно сравнить с полями в таблице с играми, и получить ID игры.

Например, на скрине в таблице банов:

gamename - HELLHALT #108
datetime - 2019-06-09 00:00:00

Таблица с играми выглядит так:

http://prntscr.com/o0qnnz - здесь я получил все игры с этим названием, оно не уникально, поэтому, этого не достаточно. Единственно что тут можно, добавить дату к запросу, но проблема в том, что, даты разные, нельзя просто использовать сравнение дат.

Вот эта игра: http://prntscr.com/o0qo1j

Соответственно данные следующие:

Таблица с банами:

gamename - HELLHALT #108
datetime - 2019-06-09 00:00:00

Таблица с играми:

gamename - HELLHALT #108
datetime - 2019-06-09 20:34:12

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

------------------

Только что пришла идея, сравнить игроков, там есть gameid.

Вот я вывел игроков по этой игре: http://prntscr.com/o0qp8r

------------------

И так, теперь что нам нужно? ....

В принципе, тогда таблица с играми нам не нужна.

Получается, можно просто вывести по игрокам и имени игры. Так, я оставлю это для заметки пока просто, сейчас буду делать. Не переносите тему в другой раздел, я тут функцию опубликую чтобы вы посмотрели, правильно ли всё, функция использует методы IPS, соответственно оно относится к этому разделу.
0

#2 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 622
  • Регистрация: 16-Январь 18
  • Репутация: 7
  • Откуда:Спасск-Дальний
  • IPB version:4.1.x
 

Отправлено 12 Июнь 2019 - 08:16

Так, получилось пока следующее:

Контроллер, $table->parsers:

			'gamename' => function( $val, $row )
			{
				if ( $val ) {
					try
					{
						$ban = \IPS\wc3\Gameplayer\Ban::load( $row['id'] );

					}
					catch ( \UnderflowException $e ) {}

					$gameid = \IPS\wc3\Gameplayer\Ban::getGameID( $ban );
				}
				else {
					$gameid = NULL;
				}

				if ( $gameid ) {
					$game = $gameid;
				}
				else {
					$game = "Забанен не в игре";
				}

				return $game;
			}


Здесь мы делаем следующее:
1. Проверяем $val на пустоту, если оно есть - выполняем поиск, если нет, выдаем NULL и выводим сообщение что бан выдан не в игре.
2. На счет загрузки объектра у меня сомнения, может лучше его загружать в функции поиска? А тут передать просто ID.

Функция поиска:
	public function getGameID( $obj )
	{
		try
		{
			$gameid = \IPS\Db::i()->select( 'gameid', \IPS\wc3\Gameplayer::$databaseTable, array( 'name=? AND name=?', $obj->name, $obj->admin ) )->first();
		}
		catch ( \UnderflowException $e ) {
			$gameid = NULL;
		}

		return $gameid;
	}



Функция поиска не рабочая, там надо как-то два запроса сделать, и найти в них общий ID.

Т.е

$gameid = \IPS\Db::i()->select( 'gameid', \IPS\wc3\Gameplayer::$databaseTable, array( 'name=?', $obj->name ) );
$gameid = \IPS\Db::i()->select( 'gameid', \IPS\wc3\Gameplayer::$databaseTable, array( 'name=?', $obj->admin ) );

Т.е выведутся все игры игрока и админа, нужно найти общий ID где они играли вместе, но этого опять же мало.

Надо подключать еще таблицу с играми, по ней сравнивать дату, и имя игры, выводить id и сравнивать уже тогда этот ID с игроками, ппц...

Сообщение изменено: TemKa_SD (12 Июнь 2019 - 08:33)

0

#3 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 622
  • Регистрация: 16-Январь 18
  • Репутация: 7
  • Откуда:Спасск-Дальний
  • IPB version:4.1.x
 

Отправлено 12 Июнь 2019 - 08:42

Так, давайте заново ( буду редактировать это сообщение ).

Функция поиска:

$server = $obj->server;
$name = $obj->name;
$date = $obj->date;
$gamename = $obj->gamename;
$admin = $obj->admin;


Определяем переменные, которые будем использовать для поиска.

Первым запросом нам нужно ВСЕ игры в таблице с играми по $date и $gamename, при этом, $date - не одинаковый. Дело в том, что, бан может быть выдан в одно время, а игра завершилась на много позже, поэтому дата разная, я думаю тут может помочь first и sort, т.е мы выберем одну запись и отсортируем её по дате. Только опять же, дата разная, сравнение тут не пойдет.

Так, вот таким запросом нашлась игра http://prntscr.com/o0ru22:

		try
		{
			$gameid = \IPS\Db::i()->select( '*', 'wc3_games', array( 'gamename=? AND datetime>=?', $gamename, $date ) )->first();
		}
		catch ( \UnderflowException $e ) {
			$gameid = "НЕТ ИГРЫ";
		}


Т.е мы получили игру, которая ближе всех к времени бана. Правильно ли это?

Сообщение изменено: TemKa_SD (12 Июнь 2019 - 09:17)

0

#4 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 622
  • Регистрация: 16-Январь 18
  • Репутация: 7
  • Откуда:Спасск-Дальний
  • IPB version:4.1.x
 

Отправлено 12 Июнь 2019 - 09:47

Ну в принципе работает, я не стал пока делать проверку игроков, в принципе если потом будут баги с этим, можно будет и сделать. Вот что получилось, что скажите?

			'gamename' => function( $val, $row )
			{
				if ( $val ) {
					try
					{
						$ban = \IPS\wc3\Gameplayer\Ban::load( $row['id'] );

					}
					catch ( \UnderflowException $e ) {}

					$game = \IPS\wc3\Gameplayer\Ban::getGameID( $ban );
				}
				else {
					$game = NULL;
				}

				return $game ? $game['gamename'] . " ( " . $game['id'] . " ) " : "Не в каточке";
			}


	public function getGameID( $obj )
	{
		$date = $obj->date;
		$gamename = $obj->gamename;

		try
		{
			$game = \IPS\Db::i()->select( '*', 'wc3_games', array( 'gamename=? AND datetime>=?', $gamename, $date ) )->first();
		}
		catch ( \UnderflowException $e ) {
			$game = NULL;
		}

		return $game;
	}


Результат: http://prntscr.com/o0s8fq где 3862 - это именно тот ID, который нам надо было так упорно вычислить )))

Ну и остался вопрос по загрузке объекта, лучше в функцию передавать ID бана а не объект?

Сообщение изменено: TemKa_SD (12 Июнь 2019 - 09:48)

0

#5 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 622
  • Регистрация: 16-Январь 18
  • Репутация: 7
  • Откуда:Спасск-Дальний
  • IPB version:4.1.x
 

Отправлено 12 Июнь 2019 - 10:26

Вот финалочка:

			'gamename' => function( $val, $row )
			{
				if ( $val ) {
					$game = \IPS\wc3\Gameplayer\Ban::getGame( $row['id'] );
				}
				else {
					$game = NULL;
				}

				if ( \is_array( $game ) ) {
					$game = $game['gamename'] . " ( " . $game['id'] . " ) ";
				}

				return $game ? $game : "Бан выдан не в каточке.";
			}


	public function getGame( $id )
	{
		$ban = static::load( $id );

		try
		{
			$game = \IPS\Db::i()->select( '*', 'wc3_games', array( 'gamename=? AND datetime>=?', $ban->gamename, $ban->date ) )->first();
		}
		catch ( \UnderflowException $e ) {
			$game = NULL;
		}

		return $game;
	}


http://prntscr.com/o0sqhs

Сообщение изменено: TemKa_SD (12 Июнь 2019 - 10:27)

0

Сообщить об этой теме:


Страница 1 из 1


Быстрый ответ

  

1 пользователей читают эту тему
0 зарегистрированных, 1 гостей, 0 скрытых


Контактная информация

Вопросы по работе сайта

+7 (917) 501-4765
C 10 до 20 в рабочие дни (время московское)

Техническая поддержка

Контактные данные специалистов

Дизайн форумов

IPB 3.x ¦ IPB 2.x

Бесплатные шаблоны

IPB 3.2 – 3.4 ¦ IPB 3.1 ¦ IPB 3.0 ¦ IPB 2.2 – 2.3 ¦ IPB 2.1 ¦ Клипарт
Лицензия на использование ¦ Ваша поддержка ¦ О проекте
Copyright © 2005-2019 IPBSkins.ru Team
При копировании материалов с сайта
прямая ссылка на источник обязательна