【问题标题】:Multiple Foreign Key to same table Gas Orm同一张表Gas Orm的多个外键
【发布时间】:2016-10-15 05:05:49
【问题描述】:

自从今天早上以来,我面临着一个非常大的问题。我正在使用 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('\\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 子句

partner 中选择 * partner.pool_id IN (1)

我不知道如何向 Gas ORM 指定它不应该采用“pool_id”而是“associated_pool_id”......

谢谢你的帮助!!!!!!!!!!!!

【问题讨论】:

    标签: mysql sql codeigniter orm foreign-keys


    【解决方案1】:

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

    我决定将 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;
                    }
                }
            }
        }
    

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

    【讨论】:

    • 哇!! gas orm 的文档太少了,像这样的帮助很少能解决主要问题。我还有一个查询问题,即使用下划线将 child_table 名称附加到属性中。所以我从最后一行删除了 $child_table 。 $this->foreign_key[strtolower($child_name)] = $child_key;不确定它会在哪里产生影响,但现在它已经开始工作了。只是提到这一点,如果其他人遇到这个问题,他可以快速找到解决方案。
    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多