query – Блог Stafox'a https://stafox.cc О программировании и веб-разработке Mon, 16 Nov 2015 21:28:28 +0000 en-US hourly 1 https://wordpress.org/?v=5.8.2 Столбец в качестве ключа для результирующей выборки в Doctrine 2 https://stafox.cc/define-column-as-key-for-result-array-in-doctrine-2/ https://stafox.cc/define-column-as-key-for-result-array-in-doctrine-2/#respond Thu, 08 Oct 2015 06:02:23 +0000 http://stafox.ru/?p=2664 Вернуть в качестве ключа выборки значение одного из столбцов – довольно частая задача. Достичь результата можно несколькими способами. INDEX BY createQuery() Если Вы создаете запрос используя createQuery, то достаточно добавить к конструкции FROM конструкцию INDEX BY column_name. namespace DemoBundle\Repository; use Doctrine\ORM\EntityRepository; class SettingsRepository extends EntityRepository { public function getSettingsIndexedByName() { $query = $this->createQuery('SELECT s FROM

Сообщение Столбец в качестве ключа для результирующей выборки в Doctrine 2 появились сначала на Блог Stafox'a.

]]>
Вернуть в качестве ключа выборки значение одного из столбцов – довольно частая задача. Достичь результата можно несколькими способами.

INDEX BY

createQuery()
Если Вы создаете запрос используя createQuery, то достаточно добавить к конструкции FROM конструкцию INDEX BY column_name.


namespace DemoBundle\Repository;

use Doctrine\ORM\EntityRepository;

class SettingsRepository extends EntityRepository
{
    public function getSettingsIndexedByName()
    {
        $query = $this->createQuery('SELECT s FROM DemoBundle:Settings s INDEX BY s.name');
        return $query->getResult();
    }
}

createQueryBuilder()
Но Вы наверняка используете QueryBuilder для создания запросов, он также позволяет использовать indexBy. Метод createQueryBuilder принимает два параметра: alias и indexBy.


namespace DemoBundle\Repository;

use Doctrine\ORM\EntityRepository;

class SettingsRepository extends EntityRepository
{
    public function getSettingsIndexedByName()
    {
        $qb = $this->createQueryBuilder('s', 's.name')
            ->select('s');
        $query = $qb->getQuery();
        return $query->getResult();
    }
}

Однако в предыдущих версиях Doctrine (например 2.4.7) метод createQueryBuilder выглядит следующим образом.


public function createQueryBuilder($alias)
{
    return $this->_em->createQueryBuilder()
        ->select($alias)
        ->from($this->_entityName, $alias);
}

Как видите, нет параметра indexBy. Решить эту проблему можно расширив класс Doctrine\ORM\EntityRepository.


namespace DemoBundle\Repository;

use Doctrine\ORM\EntityRepository as DoctrineEntityRepository;

class EntityRepository extends DoctrineEntityRepository
{
    public function createQueryBuilder($alias, $indexBy = null)
    {
        return $this->_em->createQueryBuilder()
            ->select($alias)
            ->from($this->_entityName, $alias, $indexBy);
    }
}

Теперь Вам нужно только унаследовать от него свои классы-репозитории и воспользоваться переопределенным методом createQueryBuilder()

Hydrators

Также изменить вид результирующей выборки можно при помощи гидраторов. Но это уже тема для отдельной статьи.

Сообщение Столбец в качестве ключа для результирующей выборки в Doctrine 2 появились сначала на Блог Stafox'a.

]]>
https://stafox.cc/define-column-as-key-for-result-array-in-doctrine-2/feed/ 0
Zend Framework: работа с полем типа POINT в MySQL https://stafox.cc/zend-framework-work-with-point-type-in-mysql/ https://stafox.cc/zend-framework-work-with-point-type-in-mysql/#comments Tue, 22 Jan 2013 20:33:06 +0000 http://stafox.ru/?p=1896 Я расскажу Вам как на Zend Framework работать с полем типа POINT в MySQL. В этом нет ничего сложного, и сейчас Вы убедитесь в этом сами. Структуру таблицы возьмем из предыдущей статьи. Для начала нам понадобится модель, в которой мы опишем методы для работы с базой данных. [php title=”models/DbTable/Geo.php”] class Default_Model_DbTable_Geo extends Zend_Db_Table_Abstract { protected

Сообщение Zend Framework: работа с полем типа POINT в MySQL появились сначала на Блог Stafox'a.

]]>
Работа с типом POINT в MySQL

Я расскажу Вам как на Zend Framework работать с полем типа POINT в MySQL. В этом нет ничего сложного, и сейчас Вы убедитесь в этом сами.

Структуру таблицы возьмем из предыдущей статьи. Для начала нам понадобится модель, в которой мы опишем методы для работы с базой данных.
[php title=”models/DbTable/Geo.php”] class Default_Model_DbTable_Geo extends Zend_Db_Table_Abstract {

protected $_name = ‘geo’;
protected $_db;

public function addGeoPlace($place_name, $coordinates) {
$data = array(
‘place_name’ => $place_name,
‘coordinates’ => new Zend_Db_Expr("PointFromText(‘POINT($coordinates[x] $coordinates[y])’)")
);
return $this->insert($data);
}

public function getGeoLocationById($id) {
$select = $this->_db->select()
->from($this->_name, array(
‘id’,
‘place_name’
)
)
->columns(array(
‘x(coordinates) coordinates_x’,
‘y(coordinates) coordinates_y’
))
->where("id = $id");
$row = $this->_db->fetchRow($select);
return (!$row) ? null : $row;
}
}
[/php] Как Вы видите, ничего сложного. Для добавления различных выражений в ZF есть замечательный класс Zend_Db_Expr, который позволяет вставлять различные выражения. А вообще ZF сам распознает такие выражения (NOW, LOWER и прочие), если они заключены в скобки.

Ну, а пользоваться этим чудом очень просто.
[php title=”IndexController.php”] public function indexAction() {
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();

$geoModel = new Default_Model_DbTable_Geo();
$coordinates = array(
"x" => 49.2343503980067,
"y" => 2.52738212494082
);
$geoModel->addGeoPlace("My Favorite Place", $coordinates);
}
[/php]

Ну вот, таким образом Вы научились заполнять поле типа POINT в Zend Framework.

Сообщение Zend Framework: работа с полем типа POINT в MySQL появились сначала на Блог Stafox'a.

]]>
https://stafox.cc/zend-framework-work-with-point-type-in-mysql/feed/ 2
Тип данных POINT в MySQL https://stafox.cc/tip-dannyih-point-v-mysql/ https://stafox.cc/tip-dannyih-point-v-mysql/#comments Mon, 21 Jan 2013 19:41:56 +0000 http://stafox.ru/?p=1887 Не так давно передо мной стояла задача о необходимости хранить географические координаты (долготу и широту) в БД. Для этих целей в MySQL есть замечательный тип данных –  POINT. Он представляет собой структуру из нескольких полей. Кроме того, к этому типу можно (и даже нужно) применять встроенные функции. Именно эти функции определяют, какие данные необходимо хранить:

Сообщение Тип данных POINT в MySQL появились сначала на Блог Stafox'a.

]]>
Тип данных POINT в MySQL
Не так давно передо мной стояла задача о необходимости хранить географические координаты (долготу и широту) в БД. Для этих целей в MySQL есть замечательный тип данных –  POINT. Он представляет собой структуру из нескольких полей.

Кроме того, к этому типу можно (и даже нужно) применять встроенные функции. Именно эти функции определяют, какие данные необходимо хранить: точку или линию, а может даже множество точек или множество линий. Разберем пример. Есть небольшая таблица в реляционной БД, назовем ее geo. И имеет она следующую структуру
[sql] `id` int(11) NOT NULL AUTO_INCREMENT,
`place_name` varchar(40) NOT NULL,
`coordinates` point NOT NULL
[/sql]

Для того чтобы создать такую таблицу, воспользуйтесь следующим SQL-запросом:
[sql] CREATE TABLE IF NOT EXISTS `geo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`place_name` varchar(40) NOT NULL,
`coordinates` point NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
[/sql]

Для того чтобы вставить строку в таблицу, воспользуемся конструкцией INSERT
[sql] INSERT INTO `geo` (`place_name`, `coordinates`) VALUES (‘Apremont’, PointFromText(‘POINT(49.2343503980067 2.52738212494082)’));
[/sql]

У этого типа есть один недостаток: данные нельзя просмотреть. Например в phpMyAdmin данные поля coordinates будут выглядеть вот так: mysql-point-data
И для того чтобы получить долготу и широту, придется воспользоваться вот таким SQL-запросом:
[sql] SELECT X( `coordinates` ) , Y( `coordinates` )
FROM `geo`
WHERE 1
LIMIT 1
[/sql]

Остался последний нюанс. Если у Вас возникают проблемы при экспортировании данных таблицы в которой присутствуют поля типа POINT, а именно, если после экспорта данных координаты не отображаются, то это означает, что Вы неправильно сделали экспорт. Наверняка Вы сделали экспорт в текст, затем скопировали его и вставили как SQL запрос. Нужно сделать экспорт в файл, а затем сделать импорт из этого файла.

Сообщение Тип данных POINT в MySQL появились сначала на Блог Stafox'a.

]]>
https://stafox.cc/tip-dannyih-point-v-mysql/feed/ 3