【问题标题】:how to only pick the first many-to-many record and have it as a separate relation?如何只选择第一个多对多记录并将其作为单独的关系?
【发布时间】:2015-10-03 12:15:54
【问题描述】:

我的表格如下:

EventTicketSalesbelongsToMany Approvings 通过EventTicketSalesApprovings。

在EventTicketSalesTable.php里面我写了

    $this->belongsToMany('Approvings', [
        'className' => 'Contacts',
        'joinTable' => 'event_ticket_sales_approvings',
        'targetForeignKey' => 'contact_id',
        'saveStrategy' => 'replace',
    ]);

当我做分页时,我写

$contain = [
        'Approvings'
    ];

$sales = $this->paginate($this->EventTicketSales->find()->where($conditions)->join($join)->contain($contain));

在search.ctp里面,我写

 <?php foreach($eventTicketSales as $eventTicketSale):?>
    <tr>
         <td>
           <?= $eventTicketSale->approvings[0]->company ?>
         </td>
    </tr>

我想要的是

  1. 将联系人表和event_ticket_sales 表之间的多对多关系保持为批准关系,
  2. 但有办法只查询第一个 Approving only

为什么?

原因是这个查询我只需要在页面中显示第一个批准的联系人并且仍然保持分页。

我希望查询尽可能高效。

如果有更好的方法来使用连接而不是包含,我会很乐意这样做。

什么是第一个批准联系人?

假设我们有一个 event_ticket_sales 有 2 个批准。 event_ticket_sales_approvings 表中的id 最小的是第一个。是的,id 是主整数自动增量。

上述分页查询的条件是什么?

    $conditions = [
                'OR' => [
                    ['EventTicketSales.invoice_number LIKE' => '%'.$data['search_field'].'%'],
                    ['EventTicketSales.receipt_number LIKE' => '%'.$data['search_field'].'%'],
                    ['ApprovingsContacts.company LIKE'      => '%'.$data['search_field'].'%'],
                ]
            ];

更新

感谢How to limit contained associations per record/group?这里有类似的问题

但是,我想说:

  1. 该问题正在尝试查找文章及其得分最高的摘要。因此文章有很多摘要,摘要属于文章
  2. 在我的例子中,EventTicketSales 通过 EventTicketSalesApprovings 属于ToMany Approvings。这是不同的。

【问题讨论】:

标签: pagination cakephp-3.0


【解决方案1】:

看看我解决类似问题的方法:

https://groups.google.com/forum/#!topic/cake-php/104XcwVG6WI

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2011-12-30
    • 2019-10-09
    • 2014-06-30
    相关资源
    最近更新 更多