Я пытаюсь добавить объект ORM к другому (отношение один ко многим) в Кохане:
$item = $cart->cartitems->where('productid', '=', $product->id);
//if($item == null)//This apparently doesn't work in Kohana, it returns an object, even if not loaded, using the following:
if (!$item->loaded()) {
$item = new Model_Cartitem();
$item->productid = $product->id;
$item->quantity = 1; //TODO: Change to incrementation
$item->totalprice = $product->price; //TODO: Change to incrementation
$item->unitprice = $product->price;
$item->productid = $product->id;
$item->productnumber = $product->productnumber;
$cart->add('cartitem', $item);
}
$cart->save();
Вот класс корзины:
class Model_Cart extends ORM
{
protected $_has_many = array('cartitems' => array());
}
и класс cartitem:
class Model_Cartitem extends ORM {
protected $_belongs_to = array('cart' => array('foreign_key' => 'cartid'));
}
Но когда я запускаю его, я получаю сообщение об ошибке «ErrorException [8]: неопределенный индекс: cartitem ~ MODPATH \ orm \ classes \ kohana \ orm.php [1403]»
Что означает этот «неопределенный индекс» и как мне это исправить?
EDIT:
Изменил принадлежность_ в элементе модели. Вот определение моего внешнего ключа в таблице cartitems (от NaviCat):
РЕДАКТИРОВАТЬ 2:
Вот код sql для таблиц:
cartitems:
CREATE TABLE `cartitems` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`productid` INT(11) NOT NULL,
`quantity` INT(11) NOT NULL,
`totalprice` DOUBLE NOT NULL,
`cart_id` INT(11) NOT NULL,
`productname` TEXT NOT NULL,
`unitprice` DOUBLE NOT NULL,
`productnumber` TEXT NOT NULL,
PRIMARY KEY (`id`),
INDEX `cart_id` (`cart_id`),
CONSTRAINT `cart_id` FOREIGN KEY (`cart_id`) REFERENCES `carts` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=2
повозка:
CREATE TABLE `carts` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`username` TEXT NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=2
И так как я изменил имя идентификатора внешнего ключа на cart_id, я бы подумал, что смогу использовать более простые определения отношений в классах Model, поэтому я перешел к следующему:
class Model_Cart extends ORM
{
protected $_has_many = array('cartitems' => array());
}
и
class Model_Cartitem extends ORM
{
protected $_belongs_to = array('cart' => array());
}
Все еще не работает, все еще получает неопределенный индекс: ошибка cartitem ...
РЕДАКТИРОВАТЬ 3:
Хорошо, поэтому я попытался сделать то же самое в Asp.Net MVC 3, используя Entity Framework в качестве ORM, просто чтобы увидеть, было ли что-то не так с определениями таблицы базы данных. Но там все отлично работало.
Так, по крайней мере, теперь я знаю, что это не имеет ничего общего с ошибкой базы данных. Так что проблема должна лежать в ORM Kohana, и я должен делать что-то не так там. Я попробовал предложения от Йоды, но пока ничего не помогло. Это очень сложно, может быть, мне стоит вместо этого взглянуть на CodeIgniter, который должен быть проще ... Но мне немного понравилась Kohana по-другому. Неужели никто не знает, в чем проблема с моими классами ORM?
Кстати: эта часть не так? $ cart-> add ('cartitem', $ item); Я нашел единственный способ добавить объект отношений, но в то же время в документах говорится, что вы можете добавить отношения в отношении многие ко многим таким образом ... Но если это не применимо один-ко-многим, тогда как мне добавить новый cartitem в корзину?