【问题标题】:CakePHP 3: Display data from join table used in custom finderCakePHP 3:显示自定义查找器中使用的连接表中的数据
【发布时间】:2023-03-10 02:50:02
【问题描述】:
CakePHP Version: 3.1.4

我在模型 Paintings 中有一个自定义查找器,我在其中加入另一个表 Artists 并从中选择字段以便稍后在视图中显示: (它们的关系是:Paintings belongsTo Artists

class PaintingsTable extends Table
{
 // top five pics
 public function findTopfive(Query $query, array $options){

    $query
    ->join([
        'artists' =>[
            'table' => 'artists',
            'type' => 'INNER',
            'conditions' => 'Paintings.artist_id = Artists.id'
        ]
    ])
    ->select(['Paintings.id', 'Paintings.title', 'Paintings.ticket_count', 'Artists.name'])
    ->where(['ticket_count >=' => 1])
    ->order(['ticket_count' => 'DESC'])
    ->limit(5);

    return $query;
}

然后我在控制器中使用查找器:

class CashpositionsController extends AppController
{
    public function overview()
    {
        // TOP 5 paintings:
        $paintings = TableRegistry::get('Paintings');
        $top_paintings = $paintings->find('topfive');
    }
}

我可以像这样显示来自绘画的数据:

<?php foreach ($top_paintings as $paintings): ?>
   <tr>
       <td><?= h($paintings->id); ?> </td>
       <td><?= h($paintings->ticket_count); ?> </td>
       <td> <!-- here should be paintings->artist->name --> </td>
  </tr>
<?php endforeach; ?>

但是如何在此处显示来自连接表的 Artist.name?

从查询中获取数据如下:

->top_paintings(array)
  -> 0(object)
     id 9
     title nicepic
     ticket_count 4
     artist_id 80
     -> Artists(array)
         name MrArtist
  -> 1(object)

所以数据在那里,但我无法显示它。我尝试了在其他文件中成功使用的语法的各种方法,但我无法弄清楚这一点。我在 Cookbook 中也找不到这方面的示例,但也许我搜索了错误的地方。

正确的语法是什么?

【问题讨论】:

  • 如果表关系设置正确,您应该能够跳过查找中的连接子句,而使用-&gt;contain(['Artists']),并且您的输出应该可以在$painting-&gt;artist-&gt;name 获得。
  • 感谢您的建议!我现在使用-&gt;contain(['Artists']),而不是模型的finder 函数中的-&gt;join([...]),但我仍然需要-&gt;select 字段,如'this_artist' =&gt; Artist.name',并在视图中获取数据,如$paintings-&gt;this_artist。当我按照您所说的方式尝试其他方式时,我收到错误“尝试获取非对象的属性”,并且在 DebugKit 中看不到任何数据。知道为什么吗?表关系应该没问题。
  • 如果您完全消除 select 子句,您的数据会是什么样子?我的理解是,只选择几个特定字段的好处是极其微小的,所以我一般不使用select 并获取所有数据。或者,除了select 之外,您还可以考虑使用autoFields 函数。

标签: php mysql cakephp-3.0


【解决方案1】:

好吧,纯属巧合,我想通了:

问题实际上出在模型内部的查询中,我必须为关联数据分配一个字段名称才能在视图中访问它。我想通了,因为我用预定义的 SQL 函数“count”为另一个模型做了这个例子:

// top five members
public function findTopfive(Query $query, array $options){

    $query
    ->join([
        'tickets' =>[
            'table' => 'tickets',
            'type' => 'INNER',
            'conditions' => 'Tickets.member_id = Members.id'
        ]
    ])
    ->join([
        'tickets_paintings' => [
                'table' => 'tickets_paintings',
                'type' => 'LEFT',
                'conditions' => ['tickets_paintings.ticket_id = Tickets.id']
        ]
    ])
    ->select([
        'Members.id', 
        'Members.surname',
        'Members.ticket_count', 
        'count' => $query->func()->count('tickets_paintings.painting_id')
    ])
    ->where(['ticket_count >=' => 0])
    ->group('Members.id')
    ->order(['ticket_count' => 'DESC'])
    ->limit(5);

    return $query;
}

我可以像访问视图中的其他字段一样访问计数:

<?= h($members->count); ?>

因此,要更正我之前问题中的代码,它必须如下所示:

->select('Paintings.id',....., 'this_artist' => 'Artists.name')

然后在视图中可以像访问其他字段一样访问该字段:

<?= h($paintings->this_artist); ?>

DebugKit 中显示的查询变量也将如下所示:

->top_paintings(array)
  -> 0(object)
     id 9
     title nicepic
     ticket_count 4
     artist_id 80
     this_artist MrArtist

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 2016-08-03
    • 1970-01-01
    相关资源
    最近更新 更多