Отображение нескольких значений с одинаковым именем в базе данных MySQL в Codeigniter & Dwoo - PullRequest
1 голос
/ 18 июля 2010

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

Простите, что я сделал этот вопрос настолько большим, я решил как можно более наглядно описать этот вопрос.

Таблица usermeta имеет следующие значения таблицы:

umeta_id
user_id
meta_key
meta_val

В качестве примера у меня есть следующие данные в моей таблице usermeta;

user_id = 1
meta_key = first_name
meta_value = 'dwayne

user_id = 1
meta_key = фамилия
meta_value = charrington

В моей таблице пользователей у меня есть следующие данные примера;

ID = 1
user_login = admin
user_pass = ui3h423h4o82374
user_email = test@test.com

В основном я хочу использовать следующее соединение, которое вроде бы работает, вроде:

$db = $this->db;
$db->select('wolf_users.ID, wolf_usermeta.user_id AS ID', FALSE);
$db->select('wolf_users.user_login AS user_login', FALSE);
$db->select('wolf_users.user_email AS user_email', FALSE);
$db->select('wolf_users.user_status AS status', FALSE);
$db->select('wolf_usermeta.meta_key AS meta_key', FALSE);
$db->select('wolf_usermeta.meta_value AS meta_value', FALSE);
$db->from('wolf_users');
$db->join('wolf_usermeta', 'wolf_users.ID = wolf_usermeta.user_id', 'left');
$db->where('wolf_usermeta.user_id = wolf_users.ID');
$q = $db->get();
return $q->result_array();

Во-первых: кажется, что result_array возвращает дубликаты данных из моей базы данных (что немного странно), я неправильно отформатировал свое объединение или я что-то упустил, чтобы предотвратить это? возвращение результатов только с использованием $ q-> result (), по-видимому, останавливает возврат дублирующихся данных.

Я использую Dwoo для своих шаблонов, и когда я выводю переменную, которая содержит данные, используя print_r, он не показывает дублирующегося содержимого запроса при использовании запроса, но отображает дублированное содержимое при использовании result_array (почти как это зацикливается в таблице usermeta несколько раз).

Одна из страниц, на которых я использую этот запрос к базе данных, - это страница, на которой перечислены все клиенты в базе данных, а затем получены соответствующие данные из таблицы usermeta. Поэтому мой вопрос заключается в том, как мне получить доступ к данным из обеих таблиц и затем отобразить их в моем приложении, используя foreach в моем шаблоне представления?

Ответы [ 3 ]

2 голосов
/ 19 июля 2010

Вы понимаете, как объединения работают правильно?

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

Этого можно избежать с помощью foreach после извлечения данных из базы данных или разделения вашего запроса на два запроса.

$user = $this->db
    ->select('ID, user_login, user_email, user_status AS status')
    ->where('ID', $id)
    ->get('wolf_users')
    ->row_array();

if(!$user)
{
    return FALSE;
}

$user['meta'] = $this->db
    ->select('meta_key, meta_value')
    ->where('user_id', $id)
    ->get('wolf_usermeta')
    ->result_array();

return $user;

Несколько общих советов и советов по MySQL:

wolf_users.ID, wolf_usermeta.user_id AS ID

Нет необходимости, вам нужно только один раз выбрать идентификатор пользователя. Второй выбор переопределит первый, что, конечно, то же самое.

$db->select('wolf_usermeta.meta_value AS meta_value', FALSE);

Вам не нужно этого делать, имя таблицы будет удалено из результата, поэтому переименовывать их бессмысленно.

Удачи!

0 голосов
/ 19 июля 2010

Я проверил обе таблицы базы данных, и в обеих таблицах нет повторяющихся строк. Я удалил предложение where, потому что заметил, что объединение эффективно делает то же самое в любом случае, и было избыточно иметь его там.

Я не могу понять, что здесь происходит. Из того, что я вижу, я все сделал правильно в своих объединениях, и не должно быть никаких причин, по которым строки отображаются в выводе запроса несколько раз (несмотря на то, что в базе данных нет повторяющихся строк). Возможно, есть лучший способ структурировать свои таблицы, чтобы мне было легче?

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

У меня нет ограничений уникального ключа, может ли установка поля в качестве уникального ключа вызвать проблемы? Я думал о том, чтобы сделать свой user_login (поле имени пользователя) уникальным ключом для предотвращения дублирования имен.

0 голосов
/ 18 июля 2010

Вы ожидаете, что две строки появятся с вашими примерами данных; Я не знаю, что вы имеете в виду под «дубликатами данных». Эти строки должны отличаться тем, что они будут иметь разные значения для meta_key и meta_value.

Если в этих столбцах появляются строки с одинаковыми значениями, проверили ли вы таблицу user_meta или пользовательские таблицы, чтобы убедиться, что ни в одной из них нет повторяющихся строк. У вас есть уникальные ключевые ограничения для ваших таблиц?

Я не вижу, что указанное вами предложение where вообще влияет на запрос, так как оно совпадает с условием соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...