#php #mysql #codeigniter #codeigniter-datamapper
#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’]
Ответ №1:
Вот один простой способ, предполагающий, что у вас есть взаимно однозначное отношение:
В драйвере вашей модели:
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, и вы должны изучить и поэкспериментировать со всеми его функциями, чтобы получить от него максимальную отдачу.
Ответ №2:
Это может быть хорошей возможностью использовать внешний ключ в вашей таблице драйверов. Вот ссылка на документацию MySQL по использованию внешних ключей в вашей таблице: Внешние ключи MySQL
В качестве альтернативы, если вы не хотите иметь дело с трудностями, связанными с расширенными вызовами MySQL, вы также можете просто обработать два запроса, один к вашей таблице vehicles и один к вашей таблице drivers, а затем использовать PHP для итерации (цикла) результатов, пока не сможете найти и сопоставить правильные значения друг с другом.
На самом деле оба способа, вероятно, немного сложны в настройке, но ваш внешний ключ, вероятно, будет проще поддерживать.