доктрина множественного самосоединения 1.2 - PullRequest
0 голосов
/ 01 марта 2019

Я хочу выполнить несколько самостоятельных объединений с Doctrine 1.2

У меня есть 2 таблицы

"объекты":

----------------------------------------------------
| id     | user_id   | objectname
|--------|-----------|------------------------------
| 1      | 2         | object1
| 2      | 2         | object2
| 3      | 3         | object3
| 4      | 4         | object4
| 5      | 5         | object5
----------------------------------------------------

и "пользователи"

----------------------------------------------------
| id     | parentuser_id | username
|--------|---------------|--------------------------
| 2      | 1             | firstname
| 3      | 2             | firstname2
| 4      | 2             | firstname3
| 5      | 4             | firstname4
----------------------------------------------------

Любой пользователь может иметь много подпользователей, и подпользователи могут также иметь много подпользователей и т. Д. ...

Я выполняю самосоединения, чтобы получить объекты user.id = 2 и их подпользователей, но только для одного подуровня.(user и там subuseres, а не sububusers).

BaseUser.php выглядит следующим образом:

abstract class BaseCustomer extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->setTableName('user');
        $this->hasColumn('id', 'integer', 4, array(
             'type' => 'integer',
             'length' => 4,
             'fixed' => false,
             'unsigned' => false,
             'primary' => true,
             'autoincrement' => true,
             ));
        $this->hasColumn('parentuser_id', 'integer', 4, array(
             'type' => 'integer',
             'length' => 4,
             'fixed' => false,
             'unsigned' => false,
             'primary' => false,
             'notnull' => false,
             'autoincrement' => false,
             ));
        $this->hasColumn('username', 'string', 100, array(
             'type' => 'string',
             'length' => 100,
             'fixed' => false,
             'unsigned' => false,
             'primary' => false,
             'notnull' => false,
             'autoincrement' => false,
             ));
}
public function setUp()
    {
        parent::setUp();

        $this->hasMany('User', array(
             'local' => 'id',
             'foreign' => 'parentuser_id'));

        $this->hasOne('User as Subuser', array(
             'local' => 'parentuser_id',
             'foreign' => 'id'));
}

В ObjectController.php я могу сгенерировать объект-запрос с помощью

$query-> ...;
$query->andWhere('user_id = ? OR Object.User.Subuser.id = ? ', array($user->id, $user->id));

Это генерирует SQL-запрос следующим образом:

SELECT *
FROM   object o
       LEFT JOIN user u
              ON o.user_id = u.id
       LEFT JOIN user u2
              ON u.parentuser_id = u2.id
WHERE  ( o.user_id = 2
                OR u2.id = 2 
          )

Правильно, но при этом выдаются только объекты пользователя с id = 2 и пользователя с parent_user_id = 2.

Результат:

----------------------------------------------------
| id     | user_id   | objectname
----------------------------------------------------
| 1      | 2         | object1
| 2      | 2         | object2
| 4      | 4         | object4
----------------------------------------------------

Но мне также нужен объект подпользователей подпользователей (в примере также object.id 3 и 5).Как мне это сделать?Как я могу изменить BaseUser.php и запрос?

Результат sql должен выглядеть следующим образом:

SELECT *
FROM   object o
       LEFT JOIN user u
              ON o.user_id = u.id
       LEFT JOIN user u2
              ON u.parentuser_id = u2.id
       LEFT JOIN user u3
              ON u2.parentuser_id = u3.id
WHERE  ( o.user_id = 2
                OR u2.id = 2 
                OR u3.id = 2 
          )

Спасибо за помощь.

...