0

我这里有个小问题。我对数据库中的每个产品都有 category_id。我还在数据库中有一个类别表,用于类别及其 ID。现在我需要放在一起来看。我已经进行了添加、编辑和删除操作,还显示了操作,其中类别与产品描述的其余部分一起显示。但是现在我遇到了索引操作的问题。

在节目中我这样做了:

public function getProductTable()
 {
    if (!$this->productTable) {
         $sm = $this->getServiceLocator();
         $this->productTable = $sm->get('Product\Model\ProductTable');
     }
     return $this->productTable;
 }

public function getCategoryTable() {
    if(!$this->categoryTable){
        $this->categoryTable = $this->getServiceLocator()
            ->get('Product\Model\CategoryTable');
    }
    return $this->categoryTable;
}

 public function showAction()
 {
    $id = (int) $this->params()->fromRoute('id', 0);
    if (!$id) {
         return $this->redirect()->toRoute('product', array(
             'action' => 'add'
         ));
    }

    try {
         $product = $this->getProductTable()->getProduct($id);
         $category = $this->getCategoryTable()->getCategory($product->category_id);
     }
     catch (\Exception $ex) {

         return $this->redirect()->toRoute('product', array(
             'action' => 'index'
         ));
     }

这很容易,因为在显示操作期间我会从 DB 中得到一个结果,所以我确切地知道 category_id 产品有什么。

但是,在 index.html 中,我将从 DB 中获取所有产品,并且需要在整个 Foreach 中对其进行迭代。那是我需要接电话的地方

$this->getCategoryTable()->getCategory($id);

由于这是一个使用 sm 来使用模型方法的控制器方法,我应该如何在我的 index.html 视图中使用它来获取每个产品的确切类别名称?

4

3 回答 3

1

It's massively inefficient to be calling a query to get the category names for each product individually, instead, write a method which will return an array of category names keyed by id in your CategoryTable class

public function getCategoryNames()
{
     // query to get list of names and ids

     // return array of category names, keyed by id
     $categories = array();
     foreach ($results as $result) {
          $categories[$result['id']] = $result['name'];
     }
     return $categories;
}

Call the method in your controller action and pass the result to the view ...

public function indexAction()
{
    $categories = $this->getCategoryTable()->getCategoryNames();
    $products = $this->getProductTable()->getProducts();
    return new ViewModel(array(
        'categories' => $categories,
        'products' => $products,
    ));
}

In your view, you can loop over your products, and simply access the category name by its id key in the $categories array

// index.phtml
<ul>
<?php foreach ($products as $product) : ?>
    <li>Product category  name is : <?= $categories[$product->category_id]; ?></li>
<?php endforeach; ?>
</ul>

The result is just two db calls, instead of one call to get products, and then an additional call to get the category name for each product item individually.

于 2014-04-06T12:18:48.613 回答
0

一切正常,但我会为其他人添加,当我使用您的示例时,它会引发错误:

不能将对象类型用作数组

这发生了,因为我的查询没有返回我$result['id']$result['name'] 因为我正在使用 TableGateway 并且它确实返回了$result->id$result->name所以最终函数看起来像这样:

public function getCategoryNames()
{
    $results = $this->fetchAll();
    $categories = array();

    foreach ($results as $result) {
        $categories[$result->id] = $result->name;
    }

    return $categories;
}

正如 Crisp 所说,其他一切都运行良好 :)

非常感谢脆:)

于 2014-04-08T09:43:40.743 回答
0

好吧,我认为您可以将结果直接呈现到您的视图中,因为我们都在使用 MVC 这样做有点不干净,因为所有逻辑都在控制器上使用,有时您需要很好地分割您在独立组件上的工作您创建了一个函数,并且像我的朋友一样,在我之前,他们为您提供语法,因此您将编写类似

public function name of your function()
{
    //fetching the result of your model query them all or one 
    return your result 

}

在您看来,您将必须获得价值并打印您的结果

于 2020-04-15T15:22:51.270 回答