使用Propel 1.6从3个表中检索信息和计数的单个SQL查询

Lor*_*ori 3 mysql sql propel join

我有以下(简化)数据库结构:

book

id
title
Run Code Online (Sandbox Code Playgroud)

page

id
bookId
number
Run Code Online (Sandbox Code Playgroud)

figure

id
pageId
Run Code Online (Sandbox Code Playgroud)

page.bookId并且figure.pageId是指向主键外键book.idpage.id分别.

一本书没有页面,页面也没有数字.

对于指定的书籍ID,使用单个 sql查询,我想要检索

  1. 书中的信息
  2. 包含各自信息的页面列表
  3. 每页的数字

结果的示例JSON表示如下:

{
    "id": 34, 
    "title": "The title"
    "pages": [
    {
        "id": "44",
        "number": 1
        "figureCount": 2
    },
    {
        "id": "45",
        "number": 2
        "figureCount": 5
    },
    ...
    ]
}
Run Code Online (Sandbox Code Playgroud)

这可能与Propel 1.6和结果SQL查询应该是什么?

我使用MySql 5.0.

编辑:这是我的(简化)Propel schema.xml:

<table name="book" phpName="Book">
    <column name="id" type="bigint" required="true" primaryKey="true" autoIncrement="true" />
    <column name="title" type="varchar" size="512" required="true" />
</table>

<table name="page" phpName="Page" >
    <column name="id" type="bigint" required="true" primaryKey="true" autoIncrement="true" />
    <column name="book_id" type="bigint" required="true" />
    <column name="number" type="integer" required="true" />
    <foreign-key foreignTable="book" phpName="Book" refPhpName="Page" onUpdate = "cascade" onDelete = "cascade">
       <reference local="book_id" foreign="id" />
    </foreign-key>
</table>

<table name="figure" phpName="Figure">
    <column name="id" type="bigint" required="true" primaryKey="true" autoIncrement="true" />
    <column name="page_id" type="bigint" required="true" />
    <foreign-key foreignTable="page" phpName="Page" refPhpName="Figure" onUpdate = "cascade" onDelete = "cascade">
       <reference local="page_id" foreign="id"/>
    </foreign-key>
</table>
Run Code Online (Sandbox Code Playgroud)

j0k*_*j0k 5

根据@ user1073631的答案,推进查询应该是这样的:

$books = BookQuery::create()
  ->select(array('Book.Id', 'Book.Title', 'Page.Id', 'Page.Number'))
  ->withColumn('count(Figure.ID)', 'FigureCount')
  ->leftJoin('Book.Page')
  ->leftJoin('Page.Figure')
  ->groupBy('Book.Id')
  ->groupBy('Book.Title')
  ->groupBy('Page.Id')
  ->groupBy('Page.Number')
  ->find();
Run Code Online (Sandbox Code Playgroud)

我不确定join()看到你生成的类可以更好地确定这一点.