我正在尝试使用内置的ORM在Kohana 3.3中设置产品对象。我想要它,以便在我打电话时:
$p1 = ORM::factory('product')
->where('product_type', '=', '1')
->find_all();
它将创建一个这种结构的对象:
Model_Product Object
(
[_long_list_of_kohana_properties] => Array ()
[_object:protected] => Array
(
[id] => 2
[product_type] => 1
...
[product_attributes] => Array (List of attributes)
)
)
目前,它产生了这个:
Model_Product Object
(
[_long_list_of_kohana_properties] => Array ()
[_object:protected] => Array
(
[id] => 2
[product_type] => 1
...
)
)
这是对象的相关代码和_has_many / _belongs_to:
class Model_Product extends ORM
{
protected $_db = 'default';
protected $_table_name = 'product';
protected $_primary_key = 'id';
protected $_table_columns = array(
'id',
'product_type',
...
);
protected $_has_many = array(
'product_attributes' => array(
'model' => 'productAttributes',
'foreign_key' => 'product_id',
'far_key' => 'id',
)
);
}
class Model_ProductAttribute extends ORM
{
protected $_db = 'default';
protected $_table_name = 'productAttributes';
protected $_primary_key = 'id';
protected $_table_columns = array(
'id',
'product_id',
'attribute_name',
'attribute_value',
);
protected $_belongs_to = array('product' => array(
'model' => 'product',
'foreign_key' => 'product_id',
'far_key' => 'product_id',
)
);
}
我似乎无法得到foreign_key和far_key值的正确组合来使这项工作......而且,我找不到对“far_key”目的的一个很好的解释。如果有人可以解释可能解决这个问题的外国远东,哈哈。
有关我可能搞砸的地方的任何建议吗?
提前谢谢。
答案 0 :(得分:2)
Foreign key
是this
对象的关键。其中包含有关关系的数据。
Far key
是other
对象的关键字。其中包含有关关系的数据。那把钥匙是“遥远的”
在has_many
关系中,其他对象'属于'此对象。这些对象上有一个键,指的是this
。因此far key
应为'product_id'
,外键对此关系没有影响。因为this
对象上没有(也可能不是)指向数千个属性对象的键。因此:
class Model_Product extends ORM {
protected $_has_many = array(
'product_attributes' => array(
'model' => 'productAttributes',
'far_key' => 'product_id',
));
}
belongs_to
关系。 this
对象上有一个键,指向它parent
(或其他)。因此,本地密钥(foreign_key
)应为product_id
,而far_key
对此关系没有影响。因为没有(也可能不是)另一个对象上的一个键指向所有它的孩子。因此:
class Model_ProductAttribute extends ORM {
protected $_belongs_to = array('product' => array(
'model' => 'product',
'foreign_key' => 'product_id',
'far_key' => 'product_id',
));
}
我希望这能回答你的问题。我花了一些时间才弄明白。