【问题标题】:Laravel 3: Having difficulty getting my head wrapped around the `has_one()` relationshipLaravel 3:难以理解“has_one()”关系
【发布时间】:2013-06-04 18:41:40
【问题描述】:

目标:
我的目标是能够调用$entity->legalName()->first() 并获得实体的法定名称。


型号:

#####  Entity  #####  
namespace Entity\Eloquent;
class Entity extends \Eloquent{

     public static $key = 'uuid';

     public function names(){
         return $this->has_many(
                'Entity\Eloquent\EntityName',
                'entity_uuid'
            );
     }

     public function legalName(){
         return $this->has_one(
                'Entity\Eloquent\EntityName',
                'entity_name_id_legal_name'
            );
     }
}

#####  EntityName  #####
namespace Entity\Eloquent;
class EntityName extends \Eloquent{

     /**
      * NOTE:   I've tried a few things, but
      *         currently, this model is empty.
      * /
}


已尝试:

$entity = Entity::find($uuid);
$legalName = $entity->legalName()->get();
echo '<pre>LegalName:<br />',var_dump($legalName),'</pre>';

###########################################
## ERROR:
##    Column not found: 1054 Unknown column 'entity_name_id_legal_name' in 'where clause'
##    SQL: SELECT * FROM `m3sandbox_company_name` WHERE `company_name_id_legal_name` = ?
##    Bindings: array ( 0 => 'a7ae2ea4-b342-11e2-9575-ba8c8f281c14')
###########################################


也尝试过:
我还尝试将Entity-&gt;legalName() 关系方法更改为:

public function legalName(){
    return $this->has_one
        (
            'Entity\Eloquent\EntityName',
            'id'
        );
}

虽然结果不同,但它们仍然不正确:

$entity = Entity::find($uuid);
$legalName = $entity->legalName()->get();
echo '<pre>LegalName:<br />',var_dump($legalName),'</pre>';

###########################################
## prints: null
###########################################


数据说明:
一个实体可以有 N 个名称,因此entity.uuid(一)和entity_name.entity_uuid(多)之间存在一对多的关系。
但是,一个实体只能有一个法定名称,因此entity.entity_name_id_legal_nameentity_name.id 之间存在一对一的关系。

数据:

INSERT INTO `entity` 
(`uuid`, `entity_name_id_legal_name`, `datetime_created`) 
VALUES
('a7ae2ea4-b342-11e2-9575-ba8c8f281c14', 39657, '2011-06-29 02:12:06');

INSERT INTO `entity_name` 
(`id`, `entity_uuid`, `value`, `datetime_created`) 
VALUES
(516, 'a7ae2ea4-b342-11e2-9575-ba8c8f281c14', 'Bingo', '2011-06-29 02:12:06'),
(3965, 'a7ae2ea4-b342-11e2-9575-ba8c8f281c14', 'Bango', '2013-05-17 00:00:00'),
(39657, 'a7ae2ea4-b342-11e2-9575-ba8c8f281c14', 'Bongo', '2013-05-17 00:00:00');


总结:
我需要让 entity-has-one-legalName 关系正常运作。

我错过了什么?
我哪里错了?

【问题讨论】:

  • 您是否为Entity\Eloquent\EntityName 创建了扩展 Eloquent 的模型?

标签: php laravel laravel-3 has-one


【解决方案1】:

问题是在关系方法中,has_one()的第二个参数需要取相关表中外键列的名称。

我希望有更多类似的东西:

 public function legalName(){
     return $this->has_one(
            'Entity\Eloquent\EntityName',
            'entity_id' // Name of column in the entity_names table
        );
 }

在 entity_names 表中,您应该有一个名为“entity_id”或类似的列,其中包含 EntityName 的实体 ID。

简而言之,您传递的是“实体”表中的列名,您应该传递entity_names 表中使用的列名。

如果你想保持你的表现在的布局(names表的外键存储在entities表中),你应该使用belongs_to关系。

public function legalName(){
         return $this->belongs_to(
                'Entity\Eloquent\EntityName',
                'entity_name_id_legal_name' // Name of column in the entities table
            );
     }

带有“belongs_to”的对象总是在其表中包含外键,而带有“has_one”的对象从不包含在其表中的外键。

【讨论】:

  • 谢谢...尤其是最后一行。特别有启发性的是,1)所有has_xxx()关系都指定了在相关表中找到的FK field_name,2)所有belongs_to()关系都指定了调用模型所代表的表中使用的FK field_name排除关系 3) 因此,has_many_and_belongs_to() 关系指定了在其自己的表中使用的 field_name 和在相关表中找到的 field_name。我切换到belongs_to(),效果很好。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 2011-10-15
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多