2013-03-13 3 views
1

спецификации: PHP 5 с mySQL, построенный на основе Codeigniter Framework.Как мне создать вызов базы данных php?

У меня есть таблица с базой данных game, а затем специальные спортивные таблицы, такие как soccerGame и footballGame. эти специальные спортивные таблицы имеют поле gameId, связывающееся с таблицей game. У меня есть соответствующие классы game и soccerGame/footballGame, которые оба распространяются game.

Когда я ищу информацию о игре для отображения пользователю, мне трудно понять, как динамически связывать две таблицы. Мне любопытно, можно ли получить всю информацию с помощью одного запроса. Проблема в том, что мне нужно сначала запросить таблицу game, чтобы выяснить название спорта.

Если это невозможно, моя следующая мысль - сделать это с двумя запросами. попросите мой game_model запросить игровой стол, а затем, основываясь на названии спорта, назовите соответствующую спортивную конкретную модель (то есть soccer_game_model) и получите информацию о спорте.

Я хотел бы также передать game объект в soccer_model и soccer_model будет использовать этот объект, чтобы построить мне soccerGame объект. это кажется немного глупым для меня, потому что я строю родительский объект, а затем даю его расширяющему классу, чтобы создать совершенно новый объект?

мысли?

благодарит за помощь.

EDIT:

игровой стол

gameId 
sport (soccer, basketball, football, etc) 
date 
other data 

soccerGame стол

soccerGameId 
gameId 
soccer specific information 

footballGame стол

footballGameId 
gameId 
football specific information 

и так далее для других видов спорта

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

UPDATE:

Спасибо всем за вход. Кажется, что динамический SQL возможен только через хранимые процедуры, что я сейчас не очень разбираюсь. И даже с ними все еще немного грязно. Прямо сейчас я отправлю два маршрута запроса, один для получения имени спорта, а затем переход, чтобы получить правильную модель.

С PHP стороны вещей теперь, это кажется немного глупым, чтобы получить game объект, передать его, скажем, мой soccer_game_model, а затем, которые возвращают мне soccer_game объект, который является потомком оригинальной game , Так ли это должно быть сделано? или я пропустил что-то с точки зрения ОО здесь?

+0

У меня возникли проблемы с пониманием проблемы и настройки. Можете ли вы опубликовать структуру своих таблиц? – SomeSillyName

ответ

1

Чтобы продлить на ответ Devin Янга, вы бы достичь этого, используя активный класс записи CodeIgniter в как так:

public function get_game_by_id($game_id, $table) 
{ 
    return $this->db->join('game', 'game.id = ' . $table . '.gameId', 'left') 
    ->where($table . '.gameId', $game_id) 
    ->get('game') 
    ->result(); 
} 

так вы присоединяетесь таблицы по GameID, который совместно, а затем с помощью где положение, чтобы найти правильный. Наконец, вы используете result() для возврата массива объектов.

EDIT: Я добавил вторую таблицу, чтобы В параметре вы передаете имя таблицы вы можете присоединиться к любому soccerGame, footballGame стол и т.д.

Если вы не знаете, какой вид спорта выбрать в этот момент в программе, тогда вы можете сделать шаг назад и посмотреть, как вы можете добавить это, чтобы вы знали. Я бы не хотел добавлять несколько объединений во все спортивные столы, так как вы столкнетесь с проблемами по очереди.

+0

благодарит за комментарий. проблема заключается не в том, как делать соединения, но проблема заключается в том, как определить, к какой таблице присоединиться. некоторым таблицам 'игры', возможно, придется присоединиться к таблице' footballGame', в то время как другие должны присоединиться к таблице 'soccerGame'. –

+0

Я бы посмотрел на общий дизайн вашего приложения, так как единственным способом было бы перебирать таблицы до тех пор, пока вы не найдете совпадение. Возможно, сохранение типа игры в игровой таблице было бы и идеей. Если имя соответствует таблице, поиск в правой таблице с использованием метода выше будет простым. Я предполагаю, что игра может быть только одного типа, например. футбол, футбол, конечно. – jimbo2087

+0

таблица 'game' знает, что это за спорт. могу ли я использовать это для динамического присоединения к правильной таблице? то, как вы предлагаете, потребуется сначала вызов в таблицу 'game', а затем в таблицу' soccerGame'. возможно, это единственный способ, но я надеялся, что кто-то знает способ, используя только один запрос. –

1

UPDATE

Рассмотрим прохождение параметра "спорт", когда вы смотрите на данные игры. Скорее всего, это скрытое поле.Затем вы можете использовать переключатель заявление в вашей модели:

switch($gameValue) { 
    case 'football': $gameTable = "footballGame"; break; 
    case 'soccer': $gameTable = "soccerGame"; break; 
} 

Затем основывают свой запрос от этого:

"SELECT * 
FROM ". $gameTable . " 
...etc 

Вы можете объединить таблицы с соединениями. http://www.w3schools.com/sql/sql_join.asp

Например, если вам нужно, чтобы получить все данные из game и footballGame на основе footballGameId 15:

SELECT * 
FROM footballGame a 
LEFT OUTER JOIN game b ON a.id = b.gameId 
WHERE footballGameId = 15 
+0

yup, я хорошо знаком с объединениями. проблема в том, что я не знаю, к какой таблице присоединиться, прежде чем я получу некоторую информацию из таблицы 'game'. это может быть невозможно без двух запросов. Любопытно, если это было –

+0

спасибо за обновление. таблица 'game' действительно знает, какой вид спорта он принадлежит, поэтому это определенно вариант и предложение, которое другие дали. Наверное, мне было любопытно, возможно ли это сделать с 1 запросом. то есть. динамически использовать имя поля первой таблицы для имени таблицы объединенной таблицы. –

1

Check this Stack Overflow answer for options о том, как это сделать с помощью стандартного запроса. Затем вы можете включить его в активную запись, если хотите (хотя это может быть сложно и не стоит вашего времени, если вам не нужны DB-агностические вызовы в вашем приложении).

В любом случае, нет ничего плохого в выполнении нескольких запросов, это может быть медленнее, чем альтернатива. Попробуйте несколько вариантов, посмотрите, что лучше всего подходит для вас и вашего приложения.

+0

спасибо за ссылку. Я думаю, что это приближается к ответу, и это возвращает меня к чему-то еще, о чем я думал. Можно ли использовать имя поля в качестве имени таблицы в соединении? т. е. SELECT 'tableName' FROM' game' как g LEFT JOIN g.'tableName' как newTable. Это возможно? Кстати, я в настоящее время использую АР по всему сайту –

+0

Нет, вы не можете. Лучшее, что вы можете сделать, это что-то вроде этого (в котором есть свои оговорки): http://stackoverflow.com/questions/8171592/mysql-join-tables-based-on-column-data-and-table-name –

Смежные вопросы