«Неопределенный индекс» пытается добавить объект ORM в php-инфраструктуру Kohana - PullRequest
0 голосов
/ 08 сентября 2011

Я пытаюсь добавить объект 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):

Foreign key in cartitems table

РЕДАКТИРОВАТЬ 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 в корзину?

1 Ответ

1 голос
/ 08 сентября 2011

Хорошо, так что, может быть, я понял это ... Если я прав, это не имеет ничего общего с моей базой данных, которая неверна, или неправильным определением отношений класса Model.Скорее, мне кажется, что на самом деле вы не можете использовать метод add () для отношений один ко многим.Кажется, что для добавления связанного объекта в коллекцию родительского объекта вы просто сохраняете объект и вручную добавляете идентификатор внешнего ключа (cart_id), чтобы связать их.Если так, то это отличие от Asp.Net MVC и Entity Framework, которое мне было трудно понять, потому что там вас не волнует внешний ключ, он добавляется автоматически при добавлении объекта в дочернюю коллекцию, напримерэто в Asp.Net MVC: cart.cartitems.Add (item);

О, а также, когда вы просматриваете дочернюю коллекцию, кажется, что вы не можете просто сделать это:

foreach ($cart->cartitems as $item)

Как я и ожидал ... Но когда я добавляю find_all (), это работает:

foreach ($cart->cartitems->find_all() as $item)

Если это не правильный ответ, и на самом деле есть способ добавить ребенкаобъект со специальным методом, и идентификатор внешнего ключа позаботится автоматически, я хотел бы услышать это, потому что это сделало бы меня более удобным, но если нет, я надеюсь, что это поможет кому-то другому, пытающемуся перейти от Asp.Net MVC...

...