&引用;未定义索引“;尝试在Kohana php框架中添加ORM对象

&引用;未定义索引“;尝试在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

我正在尝试将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 (!$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)