#php #codeigniter-2 #codeigniter-datamapper
#php #codeigniter-2 #codeigniter-datamapper
Вопрос:
Я пытаюсь реализовать ORM в приложении CodeIgniter, но не могу заставить его работать. Для начала я просто пытаюсь создать экземпляр простой тестовой модели:
<?php
class Cart extends DataMapper
{
public function __construct()
{
// model constructor
parent::__construct();
}
var $validation = array(
'username' => array(
'label' => 'UserName',
'rules' => array('required', 'trim', 'unique', 'alpha_dash', 'min_length' => 1, 'max_length' => 50),
)
);
}
?>
И затем в контроллере я пробую это:
public function __construct()
{
parent::__construct();
$this->load->model('cart');
}
public function index()
{
$cart = new Cart();
}
Но я даже не могу пройти мимо конструктора. Отладчик останавливается и выдает мне сообщение «Ожидание входящего соединения с ключом ide xxxxx» (случайное число)
Кстати, имя файла класса модели cart указано в нижнем регистре, а имя класса — в верхнем регистре. Я пробовал оба в конструкторе.
Я тщательно следовал инструкциям по установке, скопировав два файла datamapper в библиотеки и папки конфигурации, а также загрузив библиотеку datamapper автоматически.
Но это просто не работает. Я что-то упустил? Таблица, которую я пытаюсь сопоставить, — это всего лишь тестовая таблица, в которой на самом деле есть только поле id и username. Я на самом деле не понимаю массив проверки, но просто следовал примерам в документах и изменил свое поле. Похоже, что поле id никто не вставлял в массив проверки.
Я должен также упомянуть, что я новичок в CodeIgniter.
Ответ №1:
Ваш код кажется в основном правильным для использования с DataMapper ORM и CodeIgniter.
Чтобы немного объяснить, DataMapper — это просто уровень абстракции. Он обрабатывает множество потребностей при работе с базами данных и сопоставлении ваших объектов с вашими таблицами. При этом вам не нужно загружать свои модели и т. Д. Пока вы загружаете библиотеку базы данных и библиотеку DataMapper автоматически, вы можете использовать DataMapper.
Массив проверки позволяет DataMapper узнать требования к вашим свойствам. Итак, если вы попытаетесь сохранить объект, а одно из свойств, которые вы создали / изменили, не соответствует этим требованиям, то ваше сохранение завершится неудачно, и вы получите сообщение об ошибке:
// For example
if ($myObj->save())
{
// $myObj validation passed and is saved to db
}
else
{
// $myObj validation failed, save did not complete
echo $myObj->error->string;
}
У Codeigniter уже есть библиотека с именем Cart
, поэтому вы не хотели бы называть свою модель Cart
. Таким образом, вы могли бы переименовать эту модель в Basket
или что-то еще, что имеет смысл.
Я знаю, что вы все еще просто пытаетесь заставить вещи работать, но я чувствую, что вам нужно немного подумать о своей структуре данных. Вы не сохранили username
бы в Cart
объекте, поэтому мы используем отношения. Итак, я бы структурировал его примерно так:
// baskets table (a table represents many baskets, therefore it is plural)
id
user_id
blah
blah
created
updated
// users table
id
username
email_address
created
updated
// basket model (a model represents 1 basket, therefore it is singular)
class Basket extends DataMapper
{
public function __construct()
{
parent::__construct();
}
var $has_one = array('user'); // each basket belongs to one user
var $validation = array(...);
}
// user model
class User extends DataMapper
{
public function __construct()
{
parent::__construct();
}
var $has_many = array('basket'); // each user can have many baskets
var $validation = array(...);
}
// controller
public function __construct()
{
parent::__construct();
}
public function index()
{
$basket = new Basket();
$basket->blah = 'whatever';
$basket->save();
// at this point, $basket is saved to the database
// now let's add it to the user
$user = new User();
$user->where('id', 1)->get(1);
// now we have a user
// save the relationship to the basket
$user->save($basket);
// now $basket->user_id == 1
// get the username from the basket
$u = $basket->user->get();
$username = $u->username;
// yes, there are faster and shorter ways to write most of this,
// but I think for beginners, this syntax is easier to understand
}
Комментарии:
1. Часто, когда у меня возникает проблема, которую я не могу отследить, это то, что я назвал модель или контроллер или что-то с повторяющимся именем. Не знаю, в чем ваша проблема, но вы можете это проверить.
2. Я до сих пор не знаю, действительно ли ваш ответ отвечает на вопрос, но вы можете быть правы, возможно, существует какой-то конфликт имен. В любом случае, это был лучший ответ, так что заслуга ваша. Я нашел эту ссылку с образцом приложения, которое работает, поэтому я все равно использовал ее в качестве отправной точки. Реквизит для этого парня тоже 🙂 terrymatula.com/development/2011 /…
3. Вы пробовали удалять
$this->load->model('cart');
из конструктора? Как я уже сказал в своем ответе, datamapper загружает модели для вас. Это может вызвать конфликт.
Ответ №2:
В документации CodeIgniter о моделях указано, что вы можете загрузить модель, вызвав
$this->load->model('Model_name');
в конструкторе, и что вы можете получить доступ к этой модели в вашем контроллере, выполнив
$this->Model_name->function();
Поэтому вам следует изменить код вашего контроллера на
public function __construct()
{
parent::__construct();
$this->load->model('Cart');
}
public function index()
{
$this->Cart->functionCall();
}
Комментарии:
1. Нет, к сожалению, он все еще не работает. Вы уверены, что это применимо к использованию с DataMapper, потому что в его документации говорится, что он переопределяет обычное использование моделей в CI… И все примеры использования показывают, что у меня есть в моем примере кода. Я нашел загружаемый образец проекта, который работает нормально, я просто не знаю, в чем разница с моим проектом. За исключением того, что я также использую Ion Auth для аутентификации, так что, возможно, там какой-то конфликт …?
2. Тогда я не знаю, я действительно не знаком с CodeIgniter. Последняя идея, которая у меня была, вы пытались удалить оператор var $validation = array(…)?
3. @AndersSvensson использует ORM поверх активной записи CI, поэтому загрузка моделей не требуется.