2016-12-14 91 views
0

我正在用我自己的框架使用doctrince 2.5+编写我的CMS。加入原则的问题

我的数据库表是这样的:

Item表:

+---------------------+-------------+------+-----+---------+-------+ 
| Field    | Type  | Null | Key | Default | Extra | 
+---------------------+-------------+------+-----+---------+-------+ 
| id     | int(11)  | NO | PRI | NULL |  | 
| owner_id   | int(11)  | NO | MUL | NULL |  | 
| item_id    | int(7)  | NO | MUL | NULL |  | 
| count    | bigint(20) | NO |  | NULL |  | 
| money    | varchar(32) | NO |  | NULL |  | 
| name    | varchar(32) | NO |  | NULL |  | 
+---------------------+-------------+------+-----+---------+-------+ 

Person表:

+------------------------+----------------------+------+-----+---------+-------+ 
| Field     | Type     | Null | Key | Default | Extra | 
+------------------------+----------------------+------+-----+---------+-------+ 
| Id      | int(11)    | NO | PRI | 0  |  | 
| name     | varchar(35)   | NO | UNI |   |  | 
| age     | int     | NO |  |   |  | 
+------------------------+----------------------+------+-----+---------+-------+ 

我宣布模型这样的: Item.php

class Item{ 
    /** @id @Column(type="integer", name="id")**/ 
    public $id; 
    /** @Column(type="integer", name="owner_id")**/ 
    public $owner_id; 
    /** @Column(type="integer", name = "item_id")**/ 
    public $item_id; 
    /** @Column(type="bigint", name = "count")**/ 
    public $count; 
    /** @Column(type="string", name = "money")**/ 
    public $money; 
    /** @Column(type="string", name = "name")**/ 
    public $name; 
} 

Pesron.php

class Person{ 
     /** @id @Column(type="integer", name="Id")**/ 
     public $id; 
     /** @Column(type="string", name="name", unique=true)**/ 
     public $name; 
     /** @Column(type="integer", name="age")**/ 
     public $age; 
} 

的原则是:人可以有很多项目。 如上所述,即使在mysql中,我也不会在PHP的模型中使用外键。 原因是为了减少从MySql获得的数据。 但现在我用这样的JOIN反击SQL。

SELECT i.*,p.name as Owner FROM Item i JOINT Person p on i.owner_id = p.Id 

我承担Join querya question on stackoverflow 一看,我来到这DQL:

$qb = $this->em->createQueryBuilder(); 
      $qb->select('i') 
      ->from('item','i')->join('a.person', 'p'); 

我知道这DQL是错误的。因为我在item表上没有character属性。 请给我一个关于DQL的提示。 如果不能那么我想我会使用纯SQL,我不想这样做。 请再说一遍。 在此先感谢。

+1

请重新字你的问题,因为目前还不清楚你问 - 你想只将该SQL查询翻译成DQL吗?那里有什么'a.character'(任何地方都没有列'character'的列!)?你在哪里解释你的表和实体的样子是好的,但之后的文本/问题对我来说是非常不清楚的(无论如何)... – MikO

回答

1

您写道:

$qb->select('i') 
      ->from('item','i')->join('a.character', 'u'); 

你为什么要使用 'a' 和 'u'?你至少明白你在写什么? 你不能参考这样的随机字母。

别名'i'仅用于您,因为您已在from中将i定义为item的别名。

->leftJoin('character', 'cha', 'i.owner_id = cha.id') 

在本例我定义的别名“cha”为character,那么你可以使用“cha”,使加入

+0

在[关于查询构建器的学说文档](http://docs.doctrine -project.org/projects/doctrine-orm/en/latest/reference/query-builder.html)在'15.2.1。高级API方法,他们写道:'//例子 - $ qb-> innerJoin('u.Group','g',Expr \ Join :: WITH,$ qb-> expr() - > eq('u。例如 - $ qb-> innerJoin('u.Group','g','WITH','u.status =?1','g。id') 公共函数innerJoin($ join,$ alias,$ conditionType = null,$ condition = null,$ indexBy = null);' – Hanata

+0

我写作它,但不工作。我尝试过你并且工作得很好。为什么? Doctrine文档有问题吗?有没有任何图书馆作为教条的MSDN?你能告诉我它在'vendor'文件夹中的位置吗? – Hanata

+0

非常感谢您的帮助。 – Hanata