CakePHP 中的模型可以有多个表吗?
5 回答
从手册中的这句话猜测:
模型通常是数据库的访问点,更具体地说,是数据库中某个表的访问点。默认情况下,每个模型都使用名称是其自身复数的表,即“用户”模型使用“用户”表。
我不这么认为,但你可以建立关系,也许这就是你所需要的。
当然可以,当您有很多相同的表时,它很方便。
class SomeModel extends Model
{
var $useTable = false;
public function ReadData()
{
// select table
if($a == 1)
$this->setSource('tableName1');
else if($a == 2)
$this->setSource('tableName2');
// ...
else if($a == N)
$this->setSource('tableNameN');
// now perform operations with selected table
return $this->find('all');
}
}
从技术上讲,根据您提出问题的方式,而不是我所知道的。不过,我通常会使用与您所追求的相似的事物的关系。例如,一个人的地址信息可以很容易地放入人员表中,但我通常更喜欢将其提取出来,因为其他实体也可以有地址(企业等)。
如果你想在你的数据库中实现某种伪继承模型,同样的想法。例如,志愿者是人,但承包商、供应商和员工也是人。所有这些都共享您可能希望存储在人员表中的某些属性以及对于他们所属于的人员类型而言是唯一的其他属性。
在每种情况下,您都有两个模型,但它们通过它们的关联无缝地协同工作。
如果这是您正在考虑的那种场景,那么类似的方法可能对您有用,尽管它不是关于具有多个表的模型。
它不能同时有多个表...,但您可以修改 Model::useTable 属性以将模型的表切换到不同的表。试一试,让我们知道它是否有效。
我猜你想在数据库中实现某种继承(这需要在从子表中检索信息时加入存储在父表中的数据)。我解决这个问题的方法是在子模型中使用 afterFind 回调。我重新定义了回调如下:
function afterFind($results) {
foreach ($results as $key => $val) {
$fieldRetrieved=$this->query("SELECT *field* FROM *parent_table* WHERE id={$val['*ChildModelName*']['id']}");
$results[$key]['*ChildModelName*']['*field*']=$fieldRetrieved[0]['*parent_table*']['*field*'];
}
return $results;
}
通过这种方式,我将父表中的字段包含到从子表中获得的结果中。在这种情况下,我假设两个表都是带有一个名为 id 的字段的索引,并且子表中的该字段也是父表的外键(从而创建了伪继承)。