Выберите поле без `e` или` main_table` - Magento - PullRequest
0 голосов
/ 23 января 2012

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

Это мой запрос,

Mage::getModel('review/review')->getCollection()
->addFieldToFilter('status_id' , '1')
->addFieldToFilter('email', $emailId)
->addFieldToSelect('email');

И это то, что я получаю, когда повторяю это,

 SELECT `main_table`.`email` AS `review_detail`, `detail`.`detail_id`, `detail`.`title`, `detail`.`detail`, `detail`.`nickname`, `detail`.`customer_id` FROM `review` AS `main_table` INNER JOIN `review_detail` AS `detail` ON main_table.review_id = detail.review_id WHERE (status_id = '1') AND (email = 'test@test.com')

Очевидно, что он пытается выбрать адрес электронной почты из main_table, который является review таблицей вместо review_detail таблицы. Есть ли способ выбрать поле email без префикса main_table или просто изменить запрос так, чтобы он выбирал email из таблицы review_detail?

Пожалуйста, помогите мне. Я сталкивался с сообщениями, связанными с joins, но не уверен, является ли это одним из вариантов в моем случае или нет. Заранее спасибо.

Ответы [ 5 ]

1 голос
/ 31 января 2017

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

Mage::getModel('review/review')
->getCollection()
->addExpressionFieldToSelect('email','detail.email');

Становится: detail.email AS email

0 голосов
/ 24 января 2012

Что ж, быстрый способ запустить его на данный момент заключается в том, что я напрямую передал SQL-запрос в коде. Я знаю, что это неправильный способ сделать это, но все, что я пробовал, определенно не помогало. Это мой код:

  $resource = Mage::getSingleton('core/resource');
  $readConnection = $resource->getConnection('core_read');
  $query = "SELECT a.review_id, b.email FROM  review AS a INNER JOIN review_detail AS b WHERE a.review_id = b.review_id AND a.status_id = 1 AND b.email = '" . $emailId. "'";  
  $results = $readConnection->fetchAll($query);

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

Спасибо всем за помощь.

0 голосов
/ 23 января 2012

На самом деле вы не используете псевдоним таблицы, поэтому вы получаете электронную почту из основной таблицы. Вы будете использовать 'detail' .email ='test@test.com'

0 голосов
/ 23 января 2012

Попробуйте так:

    Mage::getModel('review/review')->getCollection()
    ->addFieldToFilter('status_id' , '1')
    ->addFilter('my_cool_filter',
        $this->getConnection()->quoteInto('detail.email=?', $emailId),
        'string'
    );
0 голосов
/ 23 января 2012

Поскольку вы не указали псевдоним таблицы для поля email в методе addFieldToSelect, система по умолчанию имеет значение main_table.email

Если вы посмотрите на запрос, он соединяется с review_detail с псевдонимом таблицы detail.

INNER JOIN `review_detail` AS `detail`

Вы должны иметь возможность выбирать (и фильтровать) email из таблицы review_detail, указав `detail`.email вместо email.

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