正如你在我的历史中看到的那样,我对 kohana 有点陌生,但学得很快..我正在努力解决一个以前在 Kohana 3.3 中工作过的奇怪问题
我想在两个数据库之间创建一个连接查询。我创建了 Model_Veiligen en Model_Veilingvoorkeur 模型,并将其作为 ORM 调用:
这是正确的连接查询:
SELECT `vastprijs`, `veilingen`.`id` AS `id`, `veilingen`.`gid` AS `gid`, `veilingen`.`provincie` AS `provincie`, `veilingen`.`created` AS `created`, `veilingen`.`termtime` AS `termtime`, `veilingen`.`postcode` AS `postcode`, `veilingen`.`lat` AS `lat`, `veilingen`.`lng` AS `lng`, `veilingen`.`titel` AS `titel`, `veilingen`.`beschrijving` AS `beschrijving`, `veilingen`.`images` AS `images`, `veilingen`.`ip` AS `ip`, `veilingen`.`unique` AS `unique` FROM `veilingen` AS `veilingen` RIGHT JOIN `veilingvoorkeur` ON (`veilingen`.`id` = `vid`) ORDER BY `veilingen`.`created` DESC LIMIT 10
DIT 是 DE LEFT:
SELECT `vastprijs`, `veilingen`.`id` AS `id`, `veilingen`.`gid` AS `gid`, `veilingen`.`provincie` AS `provincie`, `veilingen`.`created` AS `created`, `veilingen`.`termtime` AS `termtime`, `veilingen`.`postcode` AS `postcode`, `veilingen`.`lat` AS `lat`, `veilingen`.`lng` AS `lng`, `veilingen`.`titel` AS `titel`, `veilingen`.`beschrijving` AS `beschrijving`, `veilingen`.`images` AS `images`, `veilingen`.`ip` AS `ip`, `veilingen`.`unique` AS `unique` FROM `veilingen` AS `veilingen` LEFT JOIN `veilingvoorkeur` ON (`veilingen`.`id` = `vid`) ORDER BY `veilingen`.`created` DESC LIMIT 10
RIGHT JOIN 输出:
[_object:protected] => Array ( [id] => [gid] => [provincie] => [created] => [termtime] => [postcode] => [lat] => [lng] => [titel] => [beschrijving] => [images] => [ip] => [unique] => [vastprijs] => 56 )
左连接输出:
[_object:protected] => Array ( [id] => 121 [gid] => 10 [provincie] => 9 [created] => 1385534362 [termtime] => 1386743962 [postcode] => 8031CJ [lat] => 52.528510 [lng] => 6.081043 [titel] => gdfgd [beschrijving] => fgfdgdfgfdsfsfd [images] => [{"file_name":"5a5a7a7ef44.png","file_size":238687,"file_type":"image\/png","file_link":"uploads\/\/5a5a7a7ef44.png"}] [ip] => 94.215.33.178 [unique] => [vastprijs] => )
我的左连接或右连接代码如下:
$veiling = ORM::factory('veilingen')
->select('vastprijs')
->join('veilingvoorkeur', 'RIGHT')
->on('veilingen.id', '=', 'vid')
->order_by('veilingen.created', DESC)
->limit(10)
->find_all();
我遇到的问题是我不理解 has_many 和 belongs_to,上面的例子以前有效,但现在不行了。
如果我在 LEFT 中更改 RIGHT 会出现问题,它将输出 veilingen 表中的所有数据。但是它忽略了 vastprijs 字段的数据。但是如果我打印 foreach 元素,我可以看到已经选择了 vastprijs。数据除外。
如果我使用 RIGHT,而不是 left。上面的故事发生了,但随后发生了其他情况。 vastprijs 不为空,veilingen 字段为空。但显示。
我的主要问题是,我如何将这 2 个表与 maybe has_many 关联起来,但 veilingen 只有 has_one veilingvoorkeur。关键是veilingen.id = veilingvoorkeur.vid
最佳答案
My main question is, how can i relate those 2 tables together with maybe has_many, but veilingen only has_one veilingvoorkeur. The key is veilingen.id = veilingvoorkeur.vid
问题在哪里? Kohana 还提供了 has_one
的可能性:
class Model_veilingen extends ORM {
protected $_has_one = array(
'veilingvoorkeur' => array(
'model' => 'veilingvoorkeur',
'far_key' => 'vid',
),
);
}
既然关系总是有两个方面,您也需要定义另一个方面。 belongs_to
当总是需要在另一边有东西时使用。
class Model_veilingvoorkeur extends ORM {
protected $_belongs_to = array(
'veilingen' => array(
'model' => 'veilingen',
'foreign_key' => 'vid',
),
);
}
如果您不确定是使用foreign_key
还是far_key
,this answer应该帮助你。还要多解释一下关系:
- A
has_one
B:A 中的一项与 B 中的一项相关或没有相关 - A
belongs_to
B:A 中的一项总是与 B 中的一项相关
您的查询现在可以这样完成:
$veilings = ORM::factory('veilingen')->order_by('created', DESC')->limit(10)
->find_all();
foreach ($veilings as $veiling) {
$veiling->veilingvoorkeur->find();
print $veiling->veilingvoorkeur->vastprijs;
}
老实说,如果 $veiling
没有相关的 veilingvoorkeur
,我不太确定该怎么办,但应该可以这样做(从想法上看)
$veilingvoorkeur = $veiling->veilingvoorkeur->find();
if (!empty($veilingvoorkeur))
print $veilingvoorkeur->vastprijs;
我没有测试代码,如果它在某个地方失败了,我希望至少已经阐明了如何使用关系来解决这个问题。
关于php - 如何在 Kohana 中使用 ORM 连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20253533/