CakePHP: как использовать оператор SQL-запроса в MVC-подобной структуре - PullRequest
0 голосов
/ 31 января 2011

Интересно, как мы используем это в среде MVC, в частности, CakePHP.

$query = oci_parse($c, "SELECT * FROM JOB ORDER BY job_title");
                        oci_execute($query);

                        while($row = oci_fetch_assoc($query)){
                            $showRowJ .= "<tr>\n";
                            $showRowJ .= "<td><a href = 'job_delete.php?jobid=".$row['JOB_ID']."'> Delete </a></td>\n";
                            $showRowJ .= "<td><a href = 'job_update.php?jobid=".$row['JOB_ID']."'> ".$row['JOB_ID']." </a></td>\n";
                            $showRowJ .= "<td>".$row['JOB_TITLE']."</td>\n";
                            $showRowJ .= "<td>".$row['REQUEST_DATE']."</td>\n";
                            $showRowJ .= "<td>".$row['START_DATE']."</td>\n";
                            $showRowJ .= "<td>".$row['NUMBER_OF_DAYS']."</td>\n";
                            $showRowJ .= "<td>".$row['STATUS']."</td>\n";
                            $showRowJ .= "<td>".$row['CLIENT_ID']."</td>\n";
                            $showRowJ .= "</tr>\n";
                            }

и если для MySQL: (пример)

$result = mysql_query('SELECT * WHERE 1=1');
if (!$result) {
    die('Invalid query: ' . mysql_error());
}

Я запутался, некоторые говорят, что это должно быть в модели, а некоторые используют find ('all')

UPDATE:

Привет, извини, я имел в виду, когда мы хотим запросить объединенные таблицы. Выше приведен только пример, когда нам нужно включить ГДЕ 2-3 раза для объединения таблиц.

Допустим, я хочу запросить:

SELECT users.name, foods.name FROM users, foods WHERE users.id='1' AND users.id=foods.id 

Нечто подобное выше ... Как мы должны это делать в CakePHP?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 31 января 2011

CakePHP выполнит весь SQL за вас, все, что вам нужно сделать, это загрузить модель, вы автоматически получите это как $ this, если вы используете установку MVC и вы находитесь в правильном контроллере.

// Get jobs and assign them to a var.
$jobs = $this->findAllByUserId($id, array('order' => 'job_title');
// Send the var to the view.
$this->set(compact($jobs));

Где findAllByUserId($id) означает «Найти все строки, где user_id = $ id».

Затем просто переберите $jobs на ваш взгляд. Cake автоматически получает все связанные модели, если в ваших моделях правильно определены отношения с $hasOne, $belongsTo и т. Д. См. отношения с базой данных в CakePHP для получения дополнительной информации.

CakePHP строго соответствует своей модели MVC, вам нужно прочитать руководство по для блогов , в котором излагаются основы и есть несколько достойных примеров.

Обновление: Обновлен код для использования findAllbyX , который может собирать все строки на основе определенного поля. Если вы хотите сделать что-то еще с CakePHP, вам нужно полностью прочитать учебник CakePHP, так как он охватывает все основные вещи, подобные этому.

2 голосов
/ 31 января 2011

Поскольку Cake включает в себя полный уровень абстракции базы данных, вы вообще не будете писать никакой SQL. Вы правильно настроили свои модели, а затем что-то вроде этого:

Контроллер

$jobs = $this->Job->find('all', array('order' => array('Job.title' => 'asc')));
$this->set(compact('jobs'));

View

<table>
<?php foreach ($jobs as $job) : ?>
    <tr><?php echo htmlentities($job['Job']['title']); ?></tr>
    ...
<?php endforeach; ?>
</table>

Может быть, вы должны следовать учебник . :)

0 голосов
/ 22 февраля 2013

Во-первых, вы должны объявить, по крайней мере, класс «Пользователь», который вы моделируете, например:

class User extends AppModel {
     public $actsAs = array('containable');
     public $hasMany = array('Food');

}

$ actsAs - это способ, которым вы можете прикрепить поведение к вашей модели, в этом случае скажем, чтоМодель может «содержать» или объединяться с другими моделями.

$ hasMany может сказать, что ваша модель может присоединиться к каким моделям.

Затем в вашем контроллере вы можете указать своей основной модели, какие другие модели ей следуетсодержать в запросе:

public function doSomething() {
     $this->User->contain(array('Food'));
     $user = $this->User->findById(1);
     $this->set(compact($user));
}

Подробнее о том, как вы можете связать свои модели здесь, можно узнать здесь: http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

Кстати, в вашем запросе

SELECT users.name, foods.name FROM users, foods WHERE users.id='1' AND users.id=foods.id 

Это должно быть

 users.id = foods.user_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...