Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: OneToMany и JOIN, помогите разобраться...

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Doctrine2
digi
Отправлено: 28 Августа, 2012 - 18:54:31
Post Id


Посетитель


Покинул форум
Сообщений всего: 406
Дата рег-ции: Янв. 2012  


Помог: 4 раз(а)




Задача в принципе простая, есть 2 таблицы: Sites и SitesDomain
т.е. один и тотже сайт может откликаться на несколько доменов.

CODE (sql):
скопировать код в буфер обмена
  1.  
  2. CREATE TABLE `engine_sites` (
  3.   `site_id` int(11) NOT NULL AUTO_INCREMENT,
  4.   `properties` longtext NOT NULL COMMENT '(DC2Type:array)',
  5.   `create_datetime` datetime NOT NULL,
  6.   PRIMARY KEY (`site_id`)
  7. ) ENGINE=InnoDB;
  8.  
  9. CREATE TABLE `engine_sites_domains` (
  10.   `domain` varchar(255) NOT NULL,
  11.   `site_id` int(11) NOT NULL,
  12.   PRIMARY KEY (`domain`),
  13.   KEY `site_id` (`site_id`)
  14. ) ENGINE=InnoDB;
  15.  


Мне нужно получить сайт запросив его домен, например раньше я делал так:

CODE (sql):
скопировать код в буфер обмена
  1.  
  2. SELECT s.*
  3. FROM engine_sites AS s
  4. JOIN engine_sites_domains AS d ON s.site_id = d.site_id
  5. WHERE d.domain = 'localhost'
  6.  


Сейчас пытаюсь всё это перевести на ОРМ, создал 2 класса сущностей:

CODE (php):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. namespace SmartCore\Bundle\EngineBundle\Entity;
  4.  
  5. use Doctrine\ORM\Mapping as ORM;
  6. use Doctrine\Common\Collections\ArrayCollection;
  7. use SmartCore\Bundle\EngineBundle\Entity\SiteDomains;
  8.  
  9. /**
  10.  * @ORM\Entity
  11.  * @ORM\Table(name="engine_sites")
  12.  */
  13. class Site
  14. {
  15.     /**
  16.      * @ORM\Id
  17.      * @ORM\Column(type="integer")
  18.      * @ORM\GeneratedValue(strategy="AUTO")
  19.      *
  20.      * @ORM\OneToMany(targetEntity="SiteDomains", mappedBy="site_id")
  21.      * @ORM\JoinColumn(name="site_id", referencedColumnName="site_id")
  22.      */
  23.     protected $site_id;
  24.  
  25.     /**
  26.      * @ORM\Column(type="array")
  27.      */
  28.     protected $properties;
  29.  
  30.     /**
  31.      * @ORM\Column(type="datetime")
  32.      */
  33.     protected $create_datetime;
  34.    
  35.     public function __construct()
  36.     {
  37.         $this->create_datetime = new \DateTime();
  38.         $this->properties = new ArrayCollection();
  39.     }
  40. }
  41.  


CODE (php):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. namespace SmartCore\Bundle\EngineBundle\Entity;
  4.  
  5. use Doctrine\ORM\Mapping as ORM;
  6. use SmartCore\Bundle\EngineBundle\Entity\Site;
  7.  
  8. /**
  9.  * @ORM\Entity
  10.  * @ORM\Table(name="engine_sites_domains",
  11.  *      indexes={
  12.  *          @ORM\Index(name="site_id", columns={"site_id"})
  13.  *      }
  14.  * )
  15.  */
  16. class SiteDomains
  17. {
  18.     /**
  19.      * @ORM\Id
  20.      * @ORM\Column(type="string")
  21.      */
  22.     protected $domain;
  23.  
  24.     /**
  25.      * @ORM\Column(type="integer")
  26.      *
  27.      * @ORM\ManyToOne(targetEntity="Site", inversedBy="site_id")
  28.      * @ORM\JoinColumn(name="site_id", referencedColumnName="site_id")
  29.      */
  30.     protected $site_id;
  31. }
  32.  


Далее написал DQL:
CODE (sql):
скопировать код в буфер обмена
  1.  
  2. SELECT s
  3. FROM SmartCoreEngineBundle:Site s JOIN s.site_id d
  4. WHERE d.domain = 'localhost'
  5.  


в ответ получаю ошибку:

CODE (text):
скопировать код в буфер обмена
  1.  
  2. [Semantical Error] line 0, col 71 near 'd
  3. ': Error: Class SmartCore\Bundle\EngineBundle\Entity\Site has no association named site_id
  4.  


Читал http://docs[dot]doctrine-project[dot]org[dot][dot][dot]ion-mapping[dot]html
http://odiszapc[dot]ru/doctrine/association-mapping/
http://docs[dot]doctrine-project[dot]org[dot][dot][dot]ry-language[dot]html
но чувствую, что-то где-то непонял Недовольство, огорчение

Скорее всего неправильно определил связи... но крутил уже всяко разно... а может быть и сам DQL неверно составлен Недовольство, огорчение кеш симфони очищаю постоянно, в доктрине кеш тоже отключен...

Если кто увидел явно ошибку, ткните пальцем плиз? Улыбка
 
 Top
caballero
Отправлено: 28 Августа, 2012 - 19:16:30
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Если кто увидел явно ошибку, ткните пальцем плиз?

Ошибка вообще связываться с ORM и вместо простого запроса в БД иметь кучу гемора.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
digi
Отправлено: 28 Августа, 2012 - 19:21:35
Post Id


Посетитель


Покинул форум
Сообщений всего: 406
Дата рег-ции: Янв. 2012  


Помог: 4 раз(а)




caballero пишет:
Ошибка вообще связываться с ORM и вместо простого запроса в БД иметь кучу гемора.


отказаться всегда успею ;)

плюсы в ОРМ уже вижу Улыбка но сейчас у меня уже спортивный интерес постичь эту штуковину ;) если проблемма по которой у меня что-то неработает заключается в том, что пока я что-то не достаточно глубоко изучил, то это одно, а если на самом деле косяк в ОРМ, то совсем другое...
 
 Top
biperch
Отправлено: 28 Августа, 2012 - 19:26:30
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 588
Дата рег-ции: Окт. 2009  
Откуда: Днепропетровск


Помог: 8 раз(а)




иди по принципу "Бритва Окамо", все упрощай
 
 Top
caballero
Отправлено: 28 Августа, 2012 - 19:30:49
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
проблемма по которой у меня что-то неработает заключается в том, что пока я что-то не достаточно глубоко изучил, то это одно, а если на самом деле косяк в ОРМ, то совсем другое...

минусов там гораздо больше чем полюсов. и один из минусов - потратить кучу времени чтобы убедится что минусов там больше чем плюсов.
Обычного PDO более чем достаточно для нормальной работы.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
digi
Отправлено: 28 Августа, 2012 - 19:34:57
Post Id


Посетитель


Покинул форум
Сообщений всего: 406
Дата рег-ции: Янв. 2012  


Помог: 4 раз(а)




возможно оно и так... а вы на сколько глубоко знакомы с доктриной? можете подсказать по теме? Улыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB