Php 如何在Kohana中使用ORM连接表

Php 如何在Kohana中使用ORM连接表,php,mysql,orm,kohana,Php,Mysql,Orm,Kohana,正如你在我的历史中所看到的,我对科哈纳有点陌生,但学习速度很快。。我正在一个奇怪的问题上挣扎,这个问题以前在Kohana 3.3中就已经解决了 我想在两个数据库之间创建一个连接查询。我创建了Model_Veiligen Model_VeilingVoworker模型,并将其作为ORM调用: 这是正确的联接查询: SELECT `vastprijs`, `veilingen`.`id` AS `id`, `veilingen`.`gid` AS `gid`, `veilingen`.`provi

正如你在我的历史中所看到的,我对科哈纳有点陌生,但学习速度很快。。我正在一个奇怪的问题上挣扎,这个问题以前在Kohana 3.3中就已经解决了

我想在两个数据库之间创建一个连接查询。我创建了Model_Veiligen Model_VeilingVoworker模型,并将其作为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
左下角为:

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
右连接输出:

[_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();
我所面临的问题是,我不明白这个例子有很多,也不知道它属于什么,上面的例子以前曾经有过,但现在已经没有了

如果我从右向左更改,就会出现问题,它将输出veilingen表中的所有数据。但它忽略了vastprijs字段的数据。但是如果我打印foreach元素,我可以看到vastprijs已经被选中。除了数据

如果我用RIGHT,而不是left。上面的故事发生了,但情况并非如此。vastprijs不为空,veilingen字段为空。但这是事实


我的主要问题是,我如何将这两个表与可能有很多表联系起来,但veilingen只有一个VeilingVoworker。键是veilingen.id=veilingvoworker.vid

我的主要问题是,我如何将这两个表与可能有很多表联系起来,但veilingen只有一个VeilingVoworker。键是veilingen.id=veilingvoworker.vid

问题出在哪里?科哈纳还提供了以下可能性:

现在,由于关系总是有两个方面,所以您也需要定义另一个方面。当总是需要在另一边有东西时使用

class Model_veilingvoorkeur extends ORM {

    protected $_belongs_to = array(
        'veilingen' => array(
            'model' => 'veilingen',
            'foreign_key' => 'vid',
        ),
    );

}
如果您不确定是使用
外键
还是
远键
,应该可以帮助您。还要进一步解释一下关系:

  • A
    has_one
    B:A中的一个项目与B中的一个项目相关或没有相关
  • A
    属于
    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
VeilingVoworker
无关,我不太确定该怎么办,但这样做应该是可能的(从想法上看)


我没有测试代码,如果代码在某个地方失败,我希望至少能够澄清如何使用关系解决这个问题

我的主要问题是,我如何将这两个表与可能有很多表联系起来,但veilingen只有一个VeilingVoworker。键是veilingen.id=veilingvoworker.vid

问题出在哪里?科哈纳还提供了以下可能性:

现在,由于关系总是有两个方面,所以您也需要定义另一个方面。当总是需要在另一边有东西时使用

class Model_veilingvoorkeur extends ORM {

    protected $_belongs_to = array(
        'veilingen' => array(
            'model' => 'veilingen',
            'foreign_key' => 'vid',
        ),
    );

}
如果您不确定是使用
外键
还是
远键
,应该可以帮助您。还要进一步解释一下关系:

  • A
    has_one
    B:A中的一个项目与B中的一个项目相关或没有相关
  • A
    属于
    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
VeilingVoworker
无关,我不太确定该怎么办,但这样做应该是可能的(从想法上看)




我没有测试代码,如果它在某个地方失败了,我希望至少已经澄清了如何使用关系来解决这个问题。

那么问题是什么?为什么你不使用
有很多
/
属于
(1:n)关系?我只是添加了一些更多的信息,我忘记了这个问题。提前谢谢。也许你能解释一下如何建立模型之间的关系吗?
veilingvoworker
是否总是在
veilingen
中有相关项(或者
vid
可以为空)?Kingkero,vid不能为空,每个veilingen条目id在vid上都有一个VeilingVoworker条目。那么问题是什么?为什么不使用一个
有许多
/
属于
(1:n)关系?我刚刚添加了一些更多信息,我忘记了这个问题。提前谢谢。也许你能解释一下如何建立模型之间的关系吗?
veilingvoworker
是否总是在
veilingen
中有相关项(或者
vid
可以为空)?Kingkero,vid不能为空,每个veilingen条目id在vid上都有一个veilingvoorkeur条目。外键是引用cother表及其匹配id的键@kingkeroCorrect(与SQL中的一样)数据库_异常[1054]:“where子句”中的未知列“VeilingVoworker.veilingen_id”[选择
veilingvoworker
id
作为
id
veilingvoworker
作为
vid
veilingvoworker
作为
startbod
veilingvoworker
作为
optbod
>vastprijs
来自
VeilingVoworkeur
作为
VeilingVoworkeur
其中
VeilingVoworkeur
veilingen\u id
='124'限制1]这看起来不像是一个连接查询,我遇到了一个奇怪的错误…他试图加载VeilingVoorkerour.veilingen_id@kingkeroDid你正确地定义了模型吗?我发布的只是关系本身的一个概要,我想是的,我在我的模型中插入了受保护的has_one和allowner,然后他给了我那个错误。外文key是引用cother表及其匹配id的键?@kingkeroCorrect(与SQL中一样)数据库_异常[1054]:where子句中的未知列“veilingvoworker.veilingen_id”[选择
veilingvoworker
id
作为
id
veilingvoworker
作为
vid
veilingvoworker
作为
startbod
veilingvoworker
作为
opbod