0

嘿,我需要一个帮助我有“产品”表和“服务”表。这两个表之间存在关联。“产品”属于“服务”,“服务”有很多“产品”。我必须为所有“产品”找到其对应的所有“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] 不起作用。

提前致谢

4

3 回答 3

1

更改$this->Product->query('select name from products');for a cake 方法: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')));

一定要为这种事情阅读cake 的方法,当你掌握它时,它们会为你节省大量时间和 sql 相关的头痛。

于 2013-04-16T13:59:25.153 回答
0

一些重要的事情..

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

  1. 在 cake 中,您可以找到关联表的记录,因为您提到了 products Belongs To Service。因此您的查询应该看起来像

    $this->Product->find('all');

如我所见,您正在寻找 NAME 和 SERVICE_ID,因此查询将是

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

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

$this->Product->recursive = 2;

希望这对你有帮助..

于 2013-04-30T06:35:27.410 回答
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 ( Controller::$uses) 中可用。

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

您可以在此处Model::find()添加条件、要获取的字段等。

@Jueecy.new 我已经对这种方式发表了评论,但是您示例中的最后一点绝对容易发生 SQLInjection!只需尝试DROP DATABASE someDB通过 HTML 输入字段并观察 DB 死掉... CakePHP 不会像那样清理混乱。这是该方法的一个特定功能Model::query- 它用于手写查询。

于 2013-04-16T13:50:01.340 回答