Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Опубликовано:

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

 

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

Рекомендованные сообщения

Опубликовано:
  • Автор

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

 

Контроллер, $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

Опубликовано:
  • Автор

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

 

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

 

$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

Опубликовано:
  • Автор

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

 

		'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

Опубликовано:
  • Автор

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

 

		'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

Создайте аккаунт или войдите в него для комментирования

Сейчас на странице 0

  • Нет пользователей, просматривающих эту страницу.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.