目标:
我的目标是能够调用$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->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_name
和entity_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');
摘要:
我需要让实体有一个legalName关系可操作。
我错过了什么
我哪里错了?
问题是在relationship方法中,has_one((的第二个参数需要采用相关表中外键列的名称。
我希望有更多类似的东西:
public function legalName(){
return $this->has_one(
'Entity'Eloquent'EntityName',
'entity_id' // Name of column in the entity_names table
);
}
在entity_name表中,应该有一个名为"entity_id"或类似的列,其中包含EntityName所在实体的id。
简而言之,您从"entity"表传递列名,您应该传递entity_name表中使用的列名。
如果您想保持表的布局(名称表的外键存储在实体表中(,则应该使用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"的对象从不在其表内包含外键。