Yii - 数据库 - 活动记录问题

时间:2010-11-05 06:02:08

标签: yii

我是Yii php框架的新手。我知道python框架 - django并设法基于MVC模式和数据库创建应用程序。现在我想在php框架中创建一些其他项目/应用程序 - 我正在尝试symfony,但现在我想尝试Yii。我的问题/问题是如何用Yii的活动记录语言编写查询。我正在阅读大量文档并尝试使用Yii的shell(yiic shell config / main.php),但没有得到我想要的结果。我有三个表--A,B和C,其中C表只包含表A和B中的外键(它们的ID)。我希望只使用第三个表(表C)来建立多对多关系。我很困惑,如何从表A中获取一些项目/记录(例如包含某些名称的记录 - 在SQL中它将类似于...名称LIKE xy),然后在表C中查找它们的ID并找到所有匹配的ID(对),最后是ID为B,从表B中提取有关特定ID的更多信息。 非常感谢您花时间阅读本文,并感谢您为我提供了一些有用的信息。

P.S。:如果您发现我的英语有任何不妥之处,请告诉我 - 我希望自己的英语能更好。

1 个答案:

答案 0 :(得分:7)

我假设您已经在手册中阅读了此页面(如果没有,请立即执行!): http://www.yiiframework.com/doc/guide/1.1/en/database.arr

无论如何,你有两个模型(AModel和BModel)和一个这样的表结构:

TableA (table for AModel)
-a_id (primary key)
-otherfieldsA

TableB (table for BModel)
-b_id (primary key)
-otherfieldsB

TableC (relation table)
-a_id (foreign key in TableA)
-b_id (foreign key in TableB)

在AModel中,添加以下MANY_MANY关系:

public function relations()
{
  return array(
    'BModels' => array(self::MANY_MANY, 'BModel', 'TableC(a_id, b_id)')
  );
}

在BModel中,添加以下MANY_MANY关系:

public function relations()
{
  return array(
    'AModels' => array(self::MANY_MANY, 'AModel', 'TableC(b_id, a_id)')
  );
}

现在,为了获得与AModel相关的所有BModel,您可以这样做:

$myAmodel = AModel::model()->findbyPk('1'); // give an id of an A model here
foreach($myAmodel->BModels as $aBmodel) {  // get all of the related B's and loop
  echo $aBmodel->otherfieldsB; // access data from the related B model
}

反之亦然:

$myBmodel = BModel::model()->findbyPk('1'); // give an id of an B model here
foreach($myBmodel->AModels as $anAmodel) { // get all of the related A's and loop
  echo $anAmodel->otherfieldsA; // access data from the related A model
}

注意:这并不能解决定义和分配新关系的问题,只是从现有关系中获取数据。要创建 new MANY_MANY关系,您需要一些自定义代码来制作表单选择小部件,并保存和更新关系表(通常在模型的afterSave()方法中自定义SQL)。

Yii扩展存储库中有一些扩展提供了行为,这使得这更容易,如下所示: