嘿,我需要一个帮助 我有“产品”表和“服务”表。这两个表之间有关联。 “产品”属于“服务”和 “服务”有很多“产品”。 我必须为所有'产品'找到相应的所有“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]无效。
提前致谢
答案 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]不要在循环中触发任何查询。这是非常糟糕的做法,会将您的应用程序性能降低到最低。
在蛋糕中,您可以找到关联表的记录,因为您提到的产品属于服务。因此,您的查询应该看起来像
$这 - &GT;制品 - &GT;发现( '全部');
我可以看到你正在寻找NAME和SERVICE_ID,因此查询将是
$this->Product->find('all',array('fields'=>array('Products.name','Service.id')));
这种情况你不需要用户递归,因为它需要
$this->Product->recursive = 2;
希望这会对你有所帮助。