&引用;未定义索引“;尝试在Kohana php框架中添加ORM对象
我正在尝试将ORM对象添加到Kohana中的另一个对象(一对多关系):&引用;未定义索引“;尝试在Kohana php框架中添加ORM对象,orm,kohana-3,php,Orm,Kohana 3,Php,我正在尝试将ORM对象添加到Kohana中的另一个对象(一对多关系): $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 (!$i
$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();
下面是cart类:
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]”
这个“未定义的索引”指的是什么,我如何修复它
编辑:
已在模型\u项目中将所属\u更改为。以下是表cartitems(来自NaviCat)中我的外键的定义:
编辑2:
以下是表的sql代码:
购物车项目:
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
由于我将外键id名称更改为cart_id,我认为我应该能够在模型类中使用更简单的关系定义,因此我改为:
class Model_Cart extends ORM
{
protected $_has_many = array('cartitems' => array());
}
及
仍然不起作用,仍然获取未定义的索引:cartitem错误
编辑3:
好的,所以我尝试在Asp.NETMVC3中做完全相同的事情,使用实体框架作为ORM,只是想看看数据库表定义是否有问题。但是那里一切都很好
所以,至少我现在知道这与数据库出错无关。所以问题一定出在科哈纳ORM上,我一定是做错了什么。我尝试了尤达的建议,但到目前为止没有任何效果。这是越来越令人沮丧的困难,也许我应该看看CodeIgniter代替,这是应该更简单。。。但我在其他方面也喜欢科哈纳。真的没有人知道我的ORM类有什么问题吗
顺便问一下:这部分错了吗$购物车->添加('cartitem',$item);这是我发现的唯一一种添加关系对象的方法,但同时,它在文档中说,您可以通过这种方式在多对多关系中添加关系。。。但是如果它不适用于一对多,那么如何将新的cartitem添加到购物车中?好的,也许我已经解决了。。。如果我是对的,这与我的数据库错误或模型类关系定义错误无关。相反,在我看来,您实际上无法在一对多关系上使用add()方法。似乎要将相关对象添加到父对象的集合中,您只需保存该对象,然后手动添加外键id(cart_id)来关联它们。如果是这样的话,这就是我很难理解的Asp.Net MVC和实体框架的区别,因为在那里你不关心外键,当你向子集合添加一个对象时,它会自动添加,就像Asp.Net MVC中这样:cart.cartitems.add(item) 哦,还有,当在儿童收藏中循环时,似乎你不能这样做:
foreach ($cart->cartitems as $item)
正如我所料。。。但当我添加find_all()时,它会起作用:
foreach ($cart->cartitems->find_all() as $item)
如果这不是正确的答案,事实上有一种方法可以使用特殊的方法添加子对象,并且外键id会自动处理,我很乐意听到它,因为这会让我更舒服,如果没有,我希望这能帮助其他人从Asp.Net MVC过渡…您指定了他们之间的关系数据了吗?这可能就是我所缺少的。我想这就是我在定义has_many and allown_to(请参阅我问题中的类声明)时所做的,不是吗?你几乎做到了,只是当主键/外键被指定时,Kohana会注意以下语法:
key\u id
。检查文档:好的,是的,我在试图解决这个问题时一直在仔细阅读它们,实际上我在模型中将Cartitem更改为:protected$\u besides\u to=array('cart'=>array('foreign\u key'=>'cartid');其中,cartid是cartitems表中定义的外键。cart表没有外键,因为我想它不应该是一对多的?我将更新我的问题,可能问题出在我的外键定义中…您是否尝试在model_cart中指定外键?Kohana正在寻找默认带有下划线(cart_id)的数据库布局。
foreach ($cart->cartitems->find_all() as $item)