我在这里遇到了一些问题。我对DB中的每个产品都有category_id。我在DB中也有类别表及其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'
));
}
这很简单,因为在showAction期间我将从DB获得一个结果,所以我确切知道category_id产品有什么。
但是,在index.phtml中,我将从DB中获取所有产品,并且需要在foreach中迭代它们。那是我需要接听电话的地方
$this->getCategoryTable()->getCategory($id);
因为这是使用sm来使用模型方法的控制器方法,我应该如何在index.phtml视图中使用它来获取每个产品的确切类别名称?
答案 0 :(得分:1)
调用查询以单独获取每个产品的类别名称是非常低效的,而是编写一个方法,该方法将返回由CategoryTable类中的id键入的类别名称数组
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;
}
在控制器操作中调用方法并将结果传递给视图...
public function indexAction()
{
$categories = $this->getCategoryTable()->getCategoryNames();
$products = $this->getProductTable()->getProducts();
return new ViewModel(array(
'categories' => $categories,
'products' => $products,
));
}
在您看来,您可以循环播放您的产品,只需通过id
数组中的$categories
键访问类别名称
// index.phtml
<ul>
<?php foreach ($products as $product) : ?>
<li>Product category name is : <?= $categories[$product->category_id]; ?></li>
<?php endforeach; ?>
</ul>
结果只是两次db调用,而不是一次调用get产品,然后另外调用以获取每个产品项的类别名称。
答案 1 :(得分: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所说,其他一切都运作良好:)
非常感谢Crisp:)
答案 2 :(得分:0)
好吧,我认为您可以直接将结果呈现到视图中,因为我们都在与MVC一起工作,因为所有逻辑都在控制器上使用,而且有时您需要在独立组件上分割工作,所以这样做有点不干净为此,您创建了一个函数,就像我的朋友一样,在我之前,他们提供了语法,因此您将编写类似
public function name of your function()
{
//fetching the result of your model query them all or one
return your result
}
在您看来,您将必须获取值并打印结果