CodeIgniter DataMapper ORM v1.8.0 - Как получить записи из нескольких таблиц - PullRequest
4 голосов
/ 01 мая 2011

Я новичок в этом и мне нужна небольшая помощь.У меня есть 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;

Как видите, у каждого водителя есть связанная с ним машина.Как я могу запросить каждого водителя и каждый автомобиль, который связан с ним в объекте.

Я могу получить все драйверы, используя это.*

var $has_one = array('vehicle');

Я хочу получить все записи в $ data ['driver']

Ответы [ 2 ]

6 голосов
/ 02 мая 2011

Вот один простой способ, при условии, что у вас есть отношения один-к-одному:

В вашей модели Драйвер :

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;

В качестве альтернативы, вы можете автоматически загружать водителя при каждом доступе к автомобилю:

// In Vehicle
var $auto_populate_has_one = TRUE;

Длямногие отношения, вы можете сделать это:

$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, лучше всего прочитать документацию полностью, а затем прочитать ее снова.Datamapper - отличный ORM, и вы должны изучить и поэкспериментировать со всеми его функциями, чтобы извлечь из этого максимум пользы.

0 голосов
/ 01 мая 2011

Это может быть хорошей возможностью использовать внешний ключ в вашей таблице драйверов.Вот ссылка на документацию MySQL по использованию внешних ключей в вашей таблице: Внешние ключи MySQL

В качестве альтернативы, если вы не хотите справляться со сложностями сложных вызовов MySQL, вы также можетепросто обработайте два запроса, один к вашей таблице транспортных средств, а другой к таблице ваших драйверов, а затем используйте PHP для итерации (цикла) результатов, пока вы не сможете найти и сопоставить правильные значения друг с другом.

Фактическиоба способа, вероятно, немного сложны в настройке, но ваш внешний ключ, вероятно, будет проще поддерживать.

...