同一桌Gas Orm的多个外键

时间:2016-06-14 12:45:38

标签: mysql sql codeigniter orm foreign-keys

由于这个mornong我面临一个非常大的问题。我正在使用CodeIgniter开发一个网站,并使用GAS ORM来建立数据库。 我基本上有两张桌子。一个名为" pool",一个名为"合作伙伴"。我在这两个表之间有两个关联,所以我的表中的两个外键引用了表池。

池(#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('\\Model\\Pool' => 'associated_pool_id', '\\Model\\Pool' => 'future_associated_pool_id');

function _init()
{

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

    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('\\Model\\Partner'),
            'future_associated_partner'  => ORM::has_many('\\Model\\Partner'),
    );

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

}

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

class Welcome extends CI_Controller {
public function index()
{

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

但我有一个错误说:

  

错误号码:1054

Champ' partner.pool_id' inconnu dans where where

SELECT * FROM partner WHERE partnerpool_id IN(1)

我不知道如何指定Gas ORM它不应该采取" pool_id"但是" associated_pool_id" ....

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

1 个答案:

答案 0 :(得分:3)

我不知道,如果这个主题仍然是最新的并且对你们有些感兴趣,但总的来说,我遇到了完全相同的问题。

我决定将Gas ORM与CodeIgniter结合使用。由于我的数据库结构已经给出,并且它没有遵循Gas的table_pk约定,我不得不自己定义一个外键,它将引用我的自定义数据库外键。但是,它的定义对任何事情都没有影响。与上面的错误一样,映射器无法构建正确的SQL语句。声明看起来与你的相似:

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

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

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

长话短说,我在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;
                }
            }
        }
    }

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