在cakePHP中从其他操作或简单查询中获取一个视图中的数据
cakePHP 2.3 在我的项目控制器的索引操作中,我有一个直接的循环来显示项目:在cakePHP中从其他操作或简单查询中获取一个视图中的数据,php,cakephp,Php,Cakephp,cakePHP 2.3 在我的项目控制器的索引操作中,我有一个直接的循环来显示项目: <?php foreach ($items as $item): ?> <tr> <td><?php echo $item['Item']['id']; if($this->Session->check('validated')){
<?php foreach ($items as $item): ?>
<tr>
<td><?php
echo $item['Item']['id'];
if($this->Session->check('validated')){
echo $this->Html->image('/img/action_delete.png',array(
'url'=>array('controller' => 'items','action'=>'markdelete',$item['Item']['id'])
));
echo $this->Html->image('/img/action_edit.png',array(
'url'=>array('controller' => 'items','action'=>'edit',$item['Item']['id'])
));
}
?>
</td>
<td><?php
echo $this->Html->link($item['Item']['item_category'], array('controller' => 'items','action'=>'index',$item['Item']['item_category']));
?>
</td>
<td>
<?php
echo $this->Html->link($item['Item']['item_title'], array('controller' => 'items', 'action' => 'view', $item['Item']['id']));
?>
</td>
<td><?php
if($item['Item']['item_photo_url'] != '') {
echo $this->Html->link('Link','/img/'.$item['Item']['item_photo_url'],array('target'=>'_blank'));
} else {
echo '---';
}
?></td>
<td><?php echo $item['Item']['item_description']; ?></td>
<td><?php echo $item['Item']['item_price']; ?></td>
</tr>
<?php endforeach; ?>
请求摘要:
假设我有一个表items,它有一个字段item\u类别。此字段是varchar,不是另一个表的主键
此外,我在Items控制器中有一个index操作,我只列出表中的所有项
我需要的是在item_category字段中选择一个不同的选项,并将其放在页面的标题上。在Items控件中:
public function index() {
$categories = $this->Item->Category->find('all');
$items = $this->Item->paginate();
$this->set(compact('items','categories'));
}
在视图中按需使用$catigories变量在ItemsController中:
public function index() {
$categories = $this->Item->Category->find('all');
$items = $this->Item->paginate();
$this->set(compact('items','categories'));
}
在视图中随意使用$catigories变量老实说,首选的方法是规范化表:) DB不仅可以更快地在(建议的)
类别
表上运行SELECT*
,而不是在所有项目的大量VARCHAR数据上运行DISTINCT
,而且在使用RDBMS和CakePHP时也是最佳做法,加上蛋糕会让你在处理数据时变得透明,所以它实际上并不复杂
因此,尽管我不明白“成为一个简单的应用程序”如何证明你的选择是正确的——从长远来看,这个应用程序可能会给你带来比现在看起来更多的麻烦——但你的操作方式会很好。只需注意,在不缓存性能的情况下,应该避免使用requestAction
如果您只需要ItemsController
中的此信息,那么最好将查找添加到itemsmodel
中,作为一个公共函数categories()
,从查找返回数据,然后在控制器中执行以下操作
$itemCategories = $this->Item->categories();
$this->set('itemCategories', $itemCategories);
您仍然可以使用该元素,只需将其传递给
$itemcegories
老实说,首选的方法是规范化表:)
DB不仅可以更快地在(建议的)类别
表上运行SELECT*
,而不是在所有项目的大量VARCHAR数据上运行DISTINCT
,而且在使用RDBMS和CakePHP时也是最佳做法,加上蛋糕会让你在处理数据时变得透明,所以它实际上并不复杂
因此,尽管我不明白“成为一个简单的应用程序”如何证明你的选择是正确的——从长远来看,这个应用程序可能会给你带来比现在看起来更多的麻烦——但你的操作方式会很好。只需注意,在不缓存性能的情况下,应该避免使用requestAction
如果您只需要ItemsController
中的此信息,那么最好将查找添加到itemsmodel
中,作为一个公共函数categories()
,从查找返回数据,然后在控制器中执行以下操作
$itemCategories = $this->Item->categories();
$this->set('itemCategories', $itemCategories);
您仍然可以使用该元素,只需传递它
$itemcegories
,可能我还不够清楚。我会更新我的帖子以便更清楚。可能我不够清楚。我会更新我的帖子以便更清晰,即使在编辑之后,你还不清楚你想做什么。我在两次阅读你的文章后得到的想法是,你已经在Items模型中有了数据,所以你只需要循环两次就可以在两个不同的地方得到它们?如果您的问题是使用distinct获取数据,那么只需在控制器中运行find with distinct并将其作为其他变量传递。但是在这种情况下,您可能需要重新考虑数据库结构,并规范化另一个表中的类别字段。@user221931:很抱歉没有这么清楚。首先,我不想规范的类别,因为这是一个非常简单的应用程序。我的主要问题是,将来自2个控制器操作的数据引入视图的最佳实践是什么。正如你在我的帖子中所看到的,我使用了第二个动作类别,并且我在其中做出了区分。这个动作为一个元素提供了素材,这就是我如何让它工作的。我只是不知道这种方式是否是首选……即使在编辑之后,也不清楚你想要做什么。我在两次阅读你的文章后得到的想法是,你已经在Items模型中有了数据,所以你只需要循环两次就可以在两个不同的地方得到它们?如果您的问题是使用distinct获取数据,那么只需在控制器中运行find with distinct并将其作为其他变量传递。但是在这种情况下,您可能需要重新考虑数据库结构,并规范化另一个表中的类别字段。@user221931:很抱歉没有这么清楚。首先,我不想规范的类别,因为这是一个非常简单的应用程序。我的主要问题是,将来自2个控制器操作的数据引入视图的最佳实践是什么。正如你在我的帖子中所看到的,我使用了第二个动作类别,并且我在其中做出了区分。这个动作为一个元素提供反馈,这就是我如何让它工作的。我只是不知道这种方式是否是首选……所以这是一种在我看来包含多个动作的方式?如果我不想使用requestaction,我应该在元素中做什么?CakePHP是一个MVC框架。在MVC范例中,模型应该包含大部分业务逻辑(比如60-80%的代码),控制器做数据的中间人/粘合/准备,视图应该非常精简-只是为了显示这些数据。因此,您提出的“每个视图多个操作”的问题可能是由于未识别MVC流requestAction
可以被认为是一种“黑客”,当您已经通过路由器->控制器->模型->控制器->视图,然后返回到另一个控制器->模型->控制器以获取数据。它在某些情况下是合理的,但不是作为一般规则。只是为了澄清一下,如果您需要在所有或大部分页面中显示项目类别,那么requestAction
是首选解决方案,它完全符合它的预期模式。与缓存一起使用,就如同使用静态代码一样好。如果您只需要类别