Я создаю веб-приложение и решил использовать подобную таблицу и имена полей к Wordpress в моем приложении. Этим я подразумеваю, что у меня есть пользовательская таблица и usermeta таблица, подобная тому, как 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 = last_name
meta_value = charrington
В моей пользовательской таблице у меня есть следующие данные в качестве примера;
ИДЕНТИФИКАТОР = 1
user_login = администратор
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-> результат (), кажется, останавливает дублирующиеся возвращаемые данные.
Я использую Dwoo для своей шаблонной обработки и когда я повторяю переменную, которая содержит данные с помощью print_r, это не показывает дублирующегося содержания запроса при использовании запроса, но показывает дублирующееся содержание при использовании result_array (почти как циклично выполненный по usermeta таблице несколько раз).
Одна из страниц, на которых я использую этот запрос базы данных, является страницей, которая перечисляет все клиенты в базе данных и затем выбирает соответствие данным из usermeta таблицы. Таким образом, мой вопрос состоит в том, как я получаю доступ к данным из обеих таблиц и затем отображаюсь, это в моем приложении с помощью foreach, по моему мнению, обрабатывает по шаблону?
Вы понимаете, как работают объединения?
Присоединяя метаданные к пользователю, пользователь будет повторяться для каждой записи метаданных, которую вы извлекаете.
Этого можно было избежать с помощью 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);
Вам не нужно этого делать, имя таблицы будет удалено из результата, поэтому переименовывать их бессмысленно.
Удачи!
Вы ожидаете, что появятся две строки с учетом ваших данных выборки; Я не знаю, что вы имеете в виду под «повторяющимися данными». Эти строки должны отличаться тем, что у них будут разные значения для meta_key и meta_value.
Если в этих столбцах появляются строки с одинаковыми значениями, проверяли ли вы таблицу user_meta или пользовательские таблицы, чтобы убедиться, что ни в одной из них нет повторяющихся строк. Есть ли у ваших таблиц ограничения уникального ключа?
Я не вижу, чтобы указанное вами предложение where вообще влияло на запрос, поскольку оно аналогично условию соединения.
Я проверил обе таблицы базы данных, и ни в одной из них нет дублирующихся строк. Я удалил условие where, потому что заметил, что объединение в любом случае делает то же самое, и оно было лишним.
Я не могу понять, что здесь происходит. Насколько я могу судить, я все сделал правильно в моих джойнах, и не должно быть причин, по которым строки отображаются в выводе запроса несколько раз (несмотря на то, что в базе данных нет дубликатов строк). Возможно, есть лучший способ структурировать мои таблицы, чтобы облегчить себе задачу?
Приложение, которое я создаю, нуждается в некоторой функциональности пользовательских полей, как моя текущая таблица usermeta позволяет мне делать это в отдельной таблице, чтобы сохранить все чистым и разделенным.
У меня также нет ограничений уникального ключа, может ли установка поля в качестве уникального ключа вызвать проблемы? Я думал сделать user_login (поле имени пользователя) уникальным ключом, чтобы предотвратить дублирование имен.