同一张表Gas Orm的多个外键

本教程将介绍同一张表Gas Orm的多个外键的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

同一张表Gas Orm的多个外键 教程 第1张

问题描述

自从今天早上以来,我面临着一个非常大的问题.我正在使用 CodeIgniter 开发网站,并使用 GAS ORM 开发数据库.我基本上有两张桌子.一个名为pool",一个名为partners".我在这两个表之间有两个关联,因此我的表 Partners 中有两个外键引用表池.

池(#id:整数,名称:varchar)合作伙伴(#id:integer, associated_pool_id=>Pool, futur_associated_pool_id=>Pool).

因为我有两个对同一个表的引用,所以我不能将外键命名为pool_id".所以在我与 Gas ORM 的关系中,我必须指定列的名称.我这样做了,但它不起作用......这是我的工作:

class Partner extends ORM {

public $primary_key = 'id';
public $foreign_key = array('ModelPool' => 'associated_pool_id', 'ModelPool' => 'future_associated_pool_id');

function _init()
{

 // Relationship definition
 self::$relationships = array(
'associated_pool' => ORM::belongs_to('ModelPool'),
'future_association_pool'  => ORM::belongs_to('ModelPool'),
 );

 self::$fields = array(
  'id' => ORM::field('auto[11]'),
  'name' => ORM::field('char[255]'),
  'associated_pool_id' => ORM::field('int[11]'),
  'future_associated_pool_id' => ORM::field('int[11]')
 );

}

在我的 Pool 课中:

class Pool extends ORM {

public $primary_key = 'id';

function _init()
{
 // Relationship definition
 self::$relationships = array(
'associated_partner' => ORM::has_many('ModelPartner'),
'future_associated_partner'  => ORM::has_many('ModelPartner'),
 );

 self::$fields = array(
  'id' => ORM::field('auto[11]'),
  'name' => ORM::field('char[50]'),
 );

}

我有一个测试控制器测试一切是否正常:

class Welcome extends CI_Controller {
public function index()
{

 $pool = ModelPool::find(1);
 echo $pool->name;
 $partners = $pool->associated_partner();
 var_dump($partners);
}

但我有一个错误说:

错误号:1054

Champ 'partner.pool_id' inconnu dans where 子句

SELECT * FROM partner WHERE partner.pool_id IN (1)

我不知道怎么向 Gas ORM 指定它不应该采用pool_id"而是associated_pool_id"......

感谢您的帮助!!!!!!!!!!!!

推荐答案

我不知道,这个话题是否仍然是最新的并且对你们中的一些人来说是有趣的,但总的来说,我遇到了完全相同的问题.

我决定将 Gas ORM 与 CodeIgniter 结合使用作为我的映射器.由于给出了我的数据库结构并且它没有遵循 Gas 的 table_pk 约定,我必须自己定义一个 外键 来引用我的自定义数据库外键.但是,它的定义对任何事情都没有影响.就像上面的错误一样,映射器无法构建正确的 SQL 语句.该声明与您的声明相似:

SELECT * FROM partner WHERE partner.pool_id IN (1)

好吧,Gas 似乎忽略了自定义外键并尝试使用默认的 table_pk 约定.这意味着,它通过将表与下划线字符合并来获取表(在您的情况下:池)和主键(id).

我发现,orm.php 的构造函数处理实体中定义的每个主键和外键.在第 191 行,代码调用了 if 子句与 empty 函数php.由于始终定义主键并且语句中没有否定,因此它每次都跳过子句的内部部分.但是,内部部分负责自定义外键.

长话短说,我在 orm.php 的第 191 行添加了一个否定(!),这导致我得到以下代码:

if ( ! empty($this->primary_key))
 {
  if ( ! empty($this->foreign_key))
  {
// Validate foreign keys for consistency naming convention recognizer
$foreign_key = array();

foreach($this->foreign_key as $namespace => $fk)
{
 $foreign_key[strtolower($namespace)] = $fk;
}

$this->foreign_key = $foreign_key;
  }
  else
  {
// If so far we didnt have any keys yet, 
// then hopefully someone is really follow Gas convention
// while he define his entity relationship (yes, YOU!)
foreach ($this->meta->get('entities') as $name => $entity)
{
 if ($entity['type'] == 'belongs_to')
 {
  $child_name  = $entity['child'];
  $child_instance = new $child_name;
  $child_table = $child_instance->table;
  $child_key= $child_instance->primary_key;

  $this->foreign_key[strtolower($child_name)] = $child_table.'_'.$child_key;
 }
}
  }
 }

嗯,这个小修复帮助了我很多,我希望你们中的一些人也可以利用这个提示.

好了关于同一张表Gas Orm的多个外键的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。