Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在cakePHP中从其他操作或简单查询中获取一个视图中的数据_Php_Cakephp - Fatal编程技术网

在cakePHP中从其他操作或简单查询中获取一个视图中的数据

在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')){

cakePHP 2.3

在我的项目控制器的索引操作中,我有一个直接的循环来显示项目:

<?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
是首选解决方案,它完全符合它的预期模式。与缓存一起使用,就如同使用静态代码一样好。如果您只需要类别