Yii CSqlDataProvider путаница - PullRequest
1 голос
/ 27 мая 2011

У меня возникли проблемы с пониманием CSqlDataProvider и с тем, как он работает.

Когда я использую CActiveDataProvider , к результатам можно получить доступ следующим образом:

$data->userProfile['first_name'];

Однако, когда я использую CSqlDataProvider, я понимаю, что результаты возвращаются как массив, а не как объект.Однако структура массива плоская.Другими словами, я вижу следующий массив:

$data['first_name'] 

вместо

$data['userProfile']['first_name']

Но проблема здесь в том, что если у меня есть другая объединенная таблица (назовем ее «автор»)) в моем коде sql, который также содержит поле first_name?С CActiveDataProvider эти два поля устранены, поэтому я могу сделать следующее для доступа к двум полям:

$data->userProfile['first_name'];
$data->author['first_name'];

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

$data['userProfile']['first_name'];
$data['author']['first_name'];

Итак, кроме присвоения уникального имени этим полям непосредственно внутри моего SQL, сделайте что-то вроде этого:

select author.first_name as author_first_name, userProfile.first_name as user_first_name

И затем обращайтесь к ним следующим образом:

$ data ['author_first_name'];$ data ['user_first_name']

Есть ли в любом случае CSqlDataProvider для автоматической структуризации массивов, чтобы они были вложены так же, как объекты CActiveDataProvider?Так что я могу вызвать их, используя $ data ['userProfile'] ['first_name']

Или есть другой класс, который я должен использовать для получения таких вложенных массивов?

Большое спасибо!

1 Ответ

2 голосов
/ 30 мая 2011

Насколько я могу судить, никакие методы БД Yii не разбивают результаты запросов JOIN на двумерные массивы, как вы ищете.Я думаю, что вам нужно - как вы предлагаете - псевдоним имен столбцов в вашем операторе select.

MySql возвращает одну строку данных, когда вы присоединяетесь к таблицам в запросе, а CSqlDataProvider возвращает именно то, что делает MySql: singleпредставление табличного массива, индексированное / ключевое по именам столбцов, так же, как возвращает ваш запрос.

Если вы хотите разбить ваши результаты на многомерный массив, я бы либо псевдоним столбцов, или использовать обычный CActiveDataProvider (который по-прежнему можно передавать сложные запросы и присоединения через CDbCritiera ).

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