Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Doctrine2: OneToMany и JOIN, помогите разобраться... / 6 сообщений из 6, страница 1 из 1
28.08.2012, 19:27:53
    #37934302
Артём.Р.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Doctrine2: OneToMany и JOIN, помогите разобраться...
Задача в принципе простая, есть 2 таблицы: Sites и SitesDomain
т.е. один и тотже сайт может откликаться на несколько доменов.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE `engine_sites` (
  `site_id` int(11) NOT NULL AUTO_INCREMENT,
  `properties` longtext NOT NULL COMMENT '(DC2Type:array)',
  `create_datetime` datetime NOT NULL,
  PRIMARY KEY (`site_id`)
) ENGINE=InnoDB;

CREATE TABLE `engine_sites_domains` (
  `domain` varchar(255) NOT NULL,
  `site_id` int(11) NOT NULL,
  PRIMARY KEY (`domain`),
  KEY `site_id` (`site_id`)
) ENGINE=InnoDB;



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

Код: sql
1.
2.
3.
4.
SELECT s.*
FROM engine_sites AS s
JOIN engine_sites_domains AS d ON s.site_id = d.site_id
WHERE d.domain = 'localhost'



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

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
<?php
namespace SmartCore\Bundle\EngineBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use SmartCore\Bundle\EngineBundle\Entity\SiteDomains;

/**
 * @ORM\Entity
 * @ORM\Table(name="engine_sites")
 */
class Site
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     * 
     * @ORM\OneToMany(targetEntity="SiteDomains", mappedBy="site_id")
     * @ORM\JoinColumn(name="site_id", referencedColumnName="site_id")
     */
    protected $site_id;

    /**
     * @ORM\Column(type="array")
     */
    protected $properties;

    /**
     * @ORM\Column(type="datetime")
     */
    protected $create_datetime;
    
    public function __construct()
    {
        $this->create_datetime = new \DateTime();
        $this->properties = new ArrayCollection();
    }
}



Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
<?php
namespace SmartCore\Bundle\EngineBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use SmartCore\Bundle\EngineBundle\Entity\Site;

/**
 * @ORM\Entity
 * @ORM\Table(name="engine_sites_domains",
 *      indexes={
 *          @ORM\Index(name="site_id", columns={"site_id"})
 *      }
 * )
 */
class SiteDomains
{
    /**
     * @ORM\Id
     * @ORM\Column(type="string")
     */
    protected $domain;

    /**
     * @ORM\Column(type="integer")
     * 
     * @ORM\ManyToOne(targetEntity="Site", inversedBy="site_id")
     * @ORM\JoinColumn(name="site_id", referencedColumnName="site_id")
     */
    protected $site_id;
}



Далее написал DQL:
Код: sql
1.
2.
3.
SELECT s
FROM SmartCoreEngineBundle:Site s JOIN s.site_id d
WHERE d.domain = 'localhost'



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

Код: sql
1.
2.
[Semantical Error] line 0, col 71 near 'd
': Error: Class SmartCore\Bundle\EngineBundle\Entity\Site has no association named site_id 



Читал http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/association-mapping.html
http://odiszapc.ru/doctrine/association-mapping/
http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html
но чувствую, что-то где-то непонял :(

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

Если кто увидел явно ошибку, ткните пальцем плиз? :)
...
Рейтинг: 0 / 0
29.08.2012, 00:54:59
    #37934570
Артём.Р.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Doctrine2: OneToMany и JOIN, помогите разобраться...
Добавил коллекцию siteDomains

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
<?php
namespace SmartCore\Bundle\EngineBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use SmartCore\Bundle\EngineBundle\Entity\SiteDomains;

/**
 * @ORM\Entity
 * @ORM\Table(name="engine_sites")
 */
class Site
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $site_id;
    
    /**
     * @ORM\Column(type="array")
     */
    protected $properties;

    /**
     * @ORM\Column(type="datetime")
     */
    protected $create_datetime;
    
    /**
     * @ORM\OneToMany(targetEntity="SiteDomains", mappedBy="site_id")
     * @ORM\JoinColumn(name="site_id", referencedColumnName="site_id")
     */
    protected $siteDomains;
    
    public function __construct()
    {
        $this->create_datetime = new \DateTime();
        $this->properties = new ArrayCollection();
        $this->siteDomains = new ArrayCollection();
    }
    
    public function getId()
    {
        return $this->site_id;
    }
    
    public function getSiteId()
    {
        return $this->site_id;
    }  
}



Также немного изменился класс siteDomains

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
<?php
namespace SmartCore\Bundle\EngineBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use SmartCore\Bundle\EngineBundle\Entity\Site;

/**
 * @ORM\Entity
 * @ORM\Table(name="engine_sites_domains",
 *      indexes={
 *          @ORM\Index(name="site_id", columns={"site_id"})
 *      }
 * )
 */
class SiteDomains
{
    /**
     * @ORM\Id
     * @ORM\Column(type="string")
     */
    protected $domain;

    /**
     * @ORM\Column(type="integer")
     * @ORM\ManyToOne(targetEntity="Site", inversedBy="site_id")
     * @ORM\JoinColumn(name="site_id", referencedColumnName="site_id")
     */
    protected $site_id;
    
    /**
     * @ORM\Column(type="datetime")
     */
    protected $create_datetime;
    
    public function __construct()
    {
        $this->create_datetime = new \DateTime();
    }     
}



при выполнении php app/console doctrine:schema:validate, получаю в ответ:

Код: sql
1.
2.
3.
4.
$ php app/console doctrine:schema:validate
[Mapping]  FAIL - The entity-class 'SmartCore\Bundle\EngineBundle\Entity\Site' mapping is invalid:
* The association SmartCore\Bundle\EngineBundle\Entity\Site#siteDomains refers to the owning side field SmartCore\Bundle\EngineBundle\Entity\SiteDomains#site_id which is not defined as association.
* The association SmartCore\Bundle\EngineBundle\Entity\Site#siteDomains refers to the owning side field SmartCore\Bundle\EngineBundle\Entity\SiteDomains#site_id which does not exist.



Так и не могу понять как можно решить данную задачу :(
...
Рейтинг: 0 / 0
29.08.2012, 01:14:25
    #37934580
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Doctrine2: OneToMany и JOIN, помогите разобраться...
плохо читал.
Код: php
1.
2.
3.
Given our previously defined example, the following would not add ORDER BY, since g is not fetch joined:

SELECT u FROM User u JOIN u.groups g WHERE SIZE(g) > 10
...
Рейтинг: 0 / 0
29.08.2012, 01:36:42
    #37934591
Артём.Р.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Doctrine2: OneToMany и JOIN, помогите разобраться...
ScareCrow , эм... а как применить ваше предложение? на данный момент дело не в DQL запросе, а в том, что надо правильно маппинг описать...

сейчас часа 3 до дыр вычитывал http://odiszapc.ru/doctrine/association-mapping/ но чего-то так и непонял :( может быть у меня задача таким образом поставлена, что при таких таблицах нет ей решения?

т.е. связи можно сделать только с PK (в данном примере РК в таблице SiteDomains является domain), а сослаться на site_id почему-то неполучается :(
...
Рейтинг: 0 / 0
29.08.2012, 01:57:47
    #37934600
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Doctrine2: OneToMany и JOIN, помогите разобраться...
site_id должен быть один. определись у какой таблицы.
...
Рейтинг: 0 / 0
29.08.2012, 09:03:02
    #37934704
Артём.Р.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Doctrine2: OneToMany и JOIN, помогите разобраться...
ScareCrow, допустим один, но как тогда привязывать домены к сайту?
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Doctrine2: OneToMany и JOIN, помогите разобраться... / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]