4

如果结果对象包含任何条目,如何在视图模板中检查?

(已经有一个类似的问题,但这一个略有不同)

CakePHP 3 博客教程为例。他们展示了如何在一页上列出所有文章:

// src/Controller/ArticlesController.php
public function index() {
  $this->set('articles', $this->Articles->find('all'));
}

和视图模板:

<!-- File: src/Template/Articles/index.ctp -->
<table>
  <tr>
    <th>Id</th>
    <th>Title</th>
  </tr>
<?php foreach ($articles as $article): ?>
  <tr>
    <td><?= $article->id ?></td>
    <td>
      <?= $this->Html->link($article->title, ['action' => 'view', $article->id]) ?>
    </td>
</tr>
<?php endforeach; ?>
</table>

缺点:如果数据库中没有条目,仍会呈现 HTML 表。

我怎样才能防止这种情况并显示一个简单的消息,比如“抱歉没有结果”?

CakePHP 2我用过

if ( !empty($articles['0']['id']) ) {
  // result table and foreach here
} else {
  echo '<p>Sorry no results...</p>';
}

但是既然$articles现在是一个对象,这不再起作用了......是否有一种新的“捷径”来检查结果对象?还是您通常先使用另一个 foreach,例如

$there_are_results = false;
foreach ($articles as $article) {
  if ( !empty($article->id) ) {
    $there_are_results = true;
    break;
  }
}
if ( $there_are_results == true ) {
  // result table and second foreach here
} else {
  echo '<p>Sorry no results...</p>';
}

感谢您的提示。

4

3 回答 3

24

您可以使用该iterator_count()函数来了解集合中是否有结果:

if (iterator_count($articles)) {
 ....
}

您还可以使用集合方法来获取第一个元素:

if (collection($articles)->first()) {
}

编辑

从 CakePHP 3.0.5 开始,检查查询或结果集是否为空的最佳方法是:

if (!$articles->isEmpty()) {
    ...
}
于 2015-05-03T08:50:48.490 回答
1

我相信你可以从你的模板中调用 $articles->count() 。(检查为 0)

于 2015-05-03T15:35:52.887 回答
0

我一直在挣扎一段时间的东西..

if(!$articles->isEmpty()) {
gives error on empty value
Call to a member function isEmpty() on null
<?php if(iterator_count($articles)) { ?>
Argument 1 passed to iterator_count() must implement interface Traversable, null given
<?php if (collection($articles)->first()) {?>
Only an array or \Traversable is allowed for Collection

我开始工作了,如果你在控制器中渲染不同的视图 $this->render('index'); 对于功能,您应该在设置值后执行此操作

于 2019-01-24T11:12:15.750 回答