Как извлечь строки из отношения многих ко многим в Propel? - PullRequest
0 голосов
/ 30 сентября 2019

Я не нашел в документации, как выбрать вложенные свойства. Мне нужен результат, подобный этому:

{
  "data": [
    {
      "Id": 3,
      "Fname": "Fname",
      "Lname": "Lname",
      "Mname": "Mname",
      "UserId": 1549,
      "Login": "manager",
      "Email": "manager@email.ru",
      "Password": null,
      "UserRole": [
        {
          UserRole object
        },
        {
          UserRole object
        },
        {
          UserRole object
        }
      ]
    }
  ],
  "totalCount": 1
}

Но мой код

$items = PanelUserQuery::create()
    ->joinWithUser()
;
$itemsCollection = $items->find();
$totalCount = $items->count();
$itemsArray = $itemsCollection ? $itemsCollection->toArray(null, null, TableMap::TYPE_PHPNAME, true) : [];
var_dump($itemsArray);

, возвращающий этот массив:

{
  "data": [
    {
      "Id": 3,
      "Fname": "Fname",
      "Lname": "Lname",
      "Mname": "Mname",
      "UserId": 1549,
      "Login": "manager",
      "Email": "manager@email.ru",
      "Password": null,
      "User": {
        "Id": 1549,
        "Login": "manager",
        "Email": "manager@mail.ru",
        "Password": null,
        "PanelUsers": [
          "*RECURSION*"
        ]
      }
    }
  ],
  "totalCount": 1
}

Моя схема: Таблица пользователей

<table name="user">
    <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
    <column name="login" type="varchar" size="999"/>

    <column name="email" type="varchar" size="999"/>
    <column name="password" type="varchar" size="40"/>
</table>

Таблица ролей

<table name="role">
    <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
    <column name="name" type="varchar" size="999" required="true"/>
    <column name="guid" type="varchar" size="999" required="true"/>
    <unique>
        <unique-column name="name"/>
    </unique>
    <unique>
        <unique-column name="guid"/>
    </unique>
</table>

Таблица пользовательских ролей

<table name="user_role" isCrossRef="true">
    <column name="user_id" type="integer" primaryKey="true"/>
    <column name="role_id" type="integer" primaryKey="true"/>
    <foreign-key foreignTable="user">
        <reference local="user_id" foreign="id"/>
    </foreign-key>
    <foreign-key foreignTable="role">
        <reference local="role_id" foreign="id"/>
    </foreign-key>
    <unique>
        <unique-column name="user_id"/>
        <unique-column name="role_id"/>
    </unique>
</table>

Таблица PanelUser

<table name="panel_user">
    <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
    <column name="fname" type="varchar" size="999"/>
    <column name="lname" type="varchar" size="999"/>
    <column name="mname" type="varchar" size="999"/>
    <column name="user_id" type="integer" required="true" />
    <foreign-key foreignTable="user" onDelete="CASCADE">
        <reference local="user_id" foreign="id" />
    </foreign-key>
    <behavior name="delegate">
        <parameter name="to" value="user" />
    </behavior>
</table>

Я не понимаю, как получить свойство UserRole и передать егоОбъект PanelUser. Помогите с пониманием методов запроса или напишите какой-нибудь код, пожалуйста

1 Ответ

0 голосов
/ 30 сентября 2019

Вам пока не нужно выравнивать весь набор результатов (->toArray()), вы можете сделать getUserRole() в цикле для $ itemsCollection-> UserRole.

foreach ($itemsCollection->getUserRole() as $userRole) {
    var_dump($userRole->toArray());
}
...