CodeIgniter DataMapper ORM v1.8.0 - 如何从多个表中获取记录

时间:2011-05-01 15:46:49

标签: php mysql codeigniter codeigniter-datamapper

我是新手,需要一些帮助。我有2张桌子......

CREATE TABLE `vehicles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `vehicle_type` varchar(50) NOT NULL,
  `vehicle_make` varchar(50) NOT NULL,
  `vehicle_model` varchar(50) NOT NULL,
  `vehicle_year` varchar(50) NOT NULL,
  `vin` varchar(50) NOT NULL,
  `registered_state` varchar(10) NOT NULL,
  `license_plate` varchar(20) NOT NULL,
  `insurrance_policy` varchar(50) NOT NULL,
  PRIMARY KEY(`id`)
)
ENGINE=INNODB;

CREATE TABLE `drivers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(50) NOT NULL,
  `last_name` varchar(50) NOT NULL,
  `dob` date NOT NULL,
  `ss_no` varchar(50) NOT NULL,
  `address` varchar(100) NOT NULL,
  `city` varchar(50) NOT NULL,
  `state` varchar(10) NOT NULL,
  `zip_code` int(5) NOT NULL,
  `cell_phone` varchar(50) NOT NULL,
  `home_phone` varchar(50),
  `dl_no` varchar(50) NOT NULL,
  `dl_state` varchar(10) NOT NULL,
  `dl_exp` date NOT NULL,
  `dl_2_no` varchar(50) NOT NULL,
  `dl_2_state` varchar(10) NOT NULL,
  `dl_2_exp` date NOT NULL,
  `vehicle_id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY(`id`),
  CONSTRAINT `Ref_01` FOREIGN KEY (`vehicle_id`)
    REFERENCES `vehicles`(`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
)
ENGINE=INNODB;

SET FOREIGN_KEY_CHECKS=1;

正如你所看到的,每个司机都有一辆与他相关的车。如何在对象中查询与他相关的每个司机和每辆车。

我可以让所有的司机使用它。

$d = new Driver();
$data['driver'] = $d->get();

在我的驱动程序模型中

var $has_one = array('vehicle');

我想获取 $ data ['driver']

中的所有记录

2 个答案:

答案 0 :(得分:6)

这是一种简单的方法,假设你有一对一的关系:

在您的模型驱动程序

var $has_one = array('vehicle');

在您的模型车辆

var $has_one = array('driver');

获得车辆及其驾驶员:

$v = new Vehicle();
$v->include_related('driver')->get();

include_related()仅适用于$has_one相关模型。

现在,驱动程序的属性存储在$v中,前缀为driver_。要访问车辆的驾驶员栏目:

echo $v->driver_first_name;
echo $v->driver_last_name;

或者,您每次进入车辆时都可以auto-load驾驶员:

// In Vehicle
var $auto_populate_has_one = TRUE;

对于has-many关系,你可以这样做:

$d = new Driver();
$d->get_by_id($id);// Get a driver by id
foreach ($d->vehicle->get() as $car)
{
    // Print all this Driver's vehicles
    echo $car->vehicle_model;
}

这只是一种方法。有可能在Datamapper中访问关系的方法,最好的办法是read the documentation彻底,然后再读一遍。 Datamapper是一个很棒的ORM,您应该学习并试验它的所有功能,以便充分利用它。

答案 1 :(得分:0)

这可能是在您的驱动程序表中使用外键的好机会。以下是表格中使用外键的MySQL文档的链接:MySQL Foreign Keys

或者,如果您不想处理高级MySQL调用的麻烦,您也可以只处理两个查询,一个到您的车辆表,一个到您的驱动程序表,然后使用PHP迭代(循环)通过结果,直到您可以找到并匹配正确的值。

实际上两种方式设置可能都有点麻烦,但是你的外键可能更容易维护。