如何访问控制器中的数组

时间:2013-04-16 10:44:02

标签: cakephp-1.3

嘿,我需要一个帮助 我有“产品”表和“服务”表。这两个表之间有关联。 “产品”属于“服务”和 “服务”有很多“产品”。 我必须为所有'产品'找到相应的所有“Service_id”。

我的代码是: -

$products = $this->Product->query('select name from products');//retrives all products
for ($p=0; $p<count($products); $p++)
                {
                  $serviceid = $this->Product->query("select service_id from products where name = $products[$p][name]");//for each product finding its all corresponding service_id

                }

在上面的代码中,$ product [$ p] [name]无效。

提前致谢

3 个答案:

答案 0 :(得分:1)

更改蛋糕方法的$this->Product->query('select name from products');find('all');

由于我不是$recursive != -1的粉丝,如果你想避免这种递归,我会把代码放在这里:

使用它的代理服务查找所有产品

$products = $this->Product->find('all', array('recursive'=>-1,
                                              'contain'=>array('Service')));

要查找与其对应产品的所有服务,它几乎相同

$services = $this->Service->find('all', array('recursive'=>-1,
                                              'contain'=>array('Product')));

请阅读the methods of cake这类事情,当你掌握它时,它们可以节省你很多时间和sql相关的麻烦。

答案 1 :(得分:0)

首先请不要这样做:

for ($p=0; $p<count($products); $p++) {...

始终将计数分配给变量:

$productsCount = count($products);

然后:

for ($p=0; $p<$productsCount; $p++) {...

当你的计数在你的循环中时,它每次都会被调用。这会对执行此语句所花费的时间产生巨大影响!这个计数只是你需要的一个静态整数值,你肯定不需要每次计算它。

关于您的问题:

您可以通过ORM执行此操作,因为您已经拥有了模型之间的关联,对吧? 这将为您提供所有相关服务的产品记录:

$this->Product->recursive = 1;
$this->Product->find('all');

你也可以“另一种方式”,但ServiceModel必须在控制器中可用(Controller::$uses)。

$this->Service->recursive = 1;
$this->Service->find('all');

您可以在Model::find() - look here中添加联系,提取字段等。

@ Jueecy.new我已经对这种方式发表了评论,但是你的例子中的最后一点绝对容易出现SQLInjection!只是尝试将DROP DATABASE someDB放在HTML输入字段中并观察数据库死... CakePHP不会像那样清理混乱。这是Model::query方法的一个特定功能 - 它用于手写查询。

答案 2 :(得分:0)

几个重要的事情......

[IMP]不要在循环中触发任何查询。这是非常糟糕的做法,会将您的应用程序性能降低到最低。

  1. 在蛋糕中,您可以找到关联表的记录,因为您提到的产品属于服务。因此,您的查询应该看起来像

    $这 - &GT;制品 - &GT;发现( '全部');

  2. 我可以看到你正在寻找NAME和SERVICE_ID,因此查询将是

    $this->Product->find('all',array('fields'=>array('Products.name','Service.id')));
    

    这种情况你不需要用户递归,因为它需要

    $this->Product->recursive = 2;
    

    希望这会对你有所帮助。