CakePHP:在类似MVC的结构中使用SQL查询语句的方法是什么

时间:2011-01-31 08:46:49

标签: php cakephp join

我想知道我们如何在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')

  

更新:

嘿抱歉我的意思是当我们想查询联合表时。以上只是我们需要包含WHERE 2-3次连接表的示例。

假设我想查询:

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

像上面那样..我们应该如何在CakePHP中做到这一点?

感谢。

3 个答案:

答案 0 :(得分:2)

由于Cake包含一个完整的数据库抽象层,因此根本不会编写任何类型的SQL。您可以正确设置模型,然后按照以下方式设置模型:

<强>控制器

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

查看

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

也许你应该关注the tutorial。 :)

答案 1 :(得分:2)

CakePHP将为您完成所有SQL,您需要做的就是加载模型,如果使用MVC设置并且您在正确的控制器中,您将自动将其设置为$ this。

// 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。只要您在模型中使用$hasOne, $belongsTo等正确定义了关系,Cake就会自动获取所有关联的模型。有关详细信息,请参阅database relationships in CakePHP

CakePHP对其MVC模型是严格的,你需要阅读blog tutorial,它概述了基础知识并有一些不错的例子。

<强>更新 更新了代码以使用findAllbyX,它可以根据特定字段收集所有行。如果你想用CakePHP做任何其他事情,你需要完全阅读CakePHP教程,因为它将涵盖所有这些基本的东西。

答案 2 :(得分:0)

首先,你必须在模型中至少声明一个“用户”类:

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