выбрать столбцы invalidQueryExeption

У меня есть две таблицы: продукт с полями идентификатора, имени, цены и бренда и бренд с полями идентификатора, имени, URL-адреса. Я хотел бы выбрать оба поля из этих двух таблиц. Я не могу определить столбцы и определить псевдонимы.

Таблица продуктов

...
public function fetchAll()
{

    $select = new Select;
    $select->from($this->table);
    $select->join('brand', 'product.brand = brand.id', array('name', 'url'));
    $select->columns(array('product.id', 'name', 'price'));

    $statement = $this->adapter->createStatement();
    $select->prepareStatement($this->adapter, $statement);

    $resultSet = new ResultSet();
    $resultSet->initialize($statement->execute());
    return $resultSet;
   }

Сообщение: SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец "product.product.id" в "списке полей"

Какова хорошая практика для запроса: выберите p.id как идентификатор, p.name как имя, p.price, b.id как бренд, b.name как название бренда...

После нескольких попыток я нашел это решение:

public function fetchAll()
{

    $select = new Select;
    $select->from($this->table);
    $select->join(array('b' => 'brand'), 'product.brand = b.id', array('brandid' => 'id', 'brandname' => 'name', 'url'));
    $select->columns(array('id', 'name', 'price'));

    $statement = $this->adapter->createStatement();
    $select->prepareStatement($this->adapter, $statement);

    $resultSet = new ResultSet();
    $resultSet->initialize($statement->execute());
    return $resultSet;
}

Я нашел, как поместить псевдоним для соединяемых таблиц, но как насчет продукта базовой таблицы?


person bsg78    schedule 22.09.2013    source источник


Ответы (1)


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

$select->from( array('p' => $this->table));

Если вы хотите добавить столбцы одновременно, вы можете сделать это так:

$select->from( array('p' => $this->table), array('id', 'name', 'price'));
// $select->columns(array('id', 'name', 'price')); // no need for that now

Чтобы добавить псевдонимы для некоторых столбцов, вы можете использовать:

$select->from( array('p' => $this->table), array('id' => 'pid', 'name' => 'pname', 'price'));

Документ: http://framework.zend.com/manual/1.12/en/zend.db.select.html#zend.db.select.building.from

Изменить:

Ваш код будет:

public function fetchAll()
{
    $select = new select();
    $select->from(array('p' => $this->table), array('id','name', 'price', 'brand'));
    $select->join(array('b' => 'brand'), 'p.brand = b.id', array('name', 'url'));

    // var_dump($select->__toString()); // Use this to print the SQL query corresponding to your select object

    $statement = $this->adapter->createStatement();
    $select->prepareStatement($this->adapter, $statement);

    $resultSet = new ResultSet();
    $resultSet->initialize($statement->execute());
    return $resultSet;
}
person Fouad Fodail    schedule 22.09.2013
comment
Первое решение работает очень хорошо. Результат: ВЫБЕРИТЕ p.*, b.id КАК бренд, b.name КАК название бренда, b.url КАК URL-адрес ИЗ продукта КАК p ВНУТРЕННЕЕ СОЕДИНЕНИЕ бренд КАК b ON p.brand = b.id. Но со вторым решением, подобным этому $select-›from(array('p' =› $this-›table), array('id', 'name')); результат тот же, хотя я не добавил поле «цена». - person bsg78; 23.09.2013