Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
TemKa_SD

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

Recommended Posts

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

 

Есть таблица с банами, 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, соответственно оно относится к этому разделу.

Share this post


Link to post
Share on other sites

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

 

Контроллер, $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 с игроками, ппц...

Edited by TemKa_SD

Share this post


Link to post
Share on other sites

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

 

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

 

$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 = "НЕТ ИГРЫ";
	}

 

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

Edited by TemKa_SD

Share this post


Link to post
Share on other sites

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

 

		'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 бана а не объект?

Edited by TemKa_SD

Share this post


Link to post
Share on other sites

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

 

		'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

Edited by TemKa_SD

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...