2013-04-16 4 views
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 

       } 

В коде выше $ продукта [$ р] [имя] не работает.

Заранее спасибо

ответ

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'); 

Вы также можете пойти «другим путем Arround», но ServiceModel должен быть доступен в контроллере (Controller::$uses).

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

Вы можете добавить contitions, поля для выборки и т.д. в Model::find() - look here.

@ Jueecy.new Я уже прокомментировал этот способ, но последний бит в вашем примере абсолютно подвержен SQLInjection! Просто попробуйте положить DROP DATABASE someDB через поле ввода HTML и посмотреть, как умирает DB ... CakePHP НЕ Убирает беспорядок как это. Это особенность метода Model::query - он используется для ручных запросов.

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-головных болей, когда вы получите его.

0

Несколько важных вещей ..

[ИМП] Не стреляйте любой запрос в цикле. Его очень плохая практика и уменьшит производительность вашего приложения до самого низкого уровня.

  1. В пироге, вы можете найти записи для ассоциированной таблицы, как вы упомянули продукты Принадлежит к Служению. Следовательно, ваш запрос должен выглядеть так:

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

Как я могу видеть ур ищет NAME и service_id, поэтому запрос будет

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

Это в этом случае и нет необходимости в пользовательском рекурсивной, так как он принимает

$this->Product->recursive = 2; 

Надежда это будет полезно для u ..

Смежные вопросы