我从学习Laravel 5中的数据库表关系开始。作为一个cakePHPer,有些东西的工作方式有点不同。我的第一个测试是这个..。
包含不同sql_types的表:
class ElementFieldType extends Model {
protected $fillable = ['name', 'sql_type'];
}表中包含链接到sql_types的ElementFieldType模型中的字段(element_field_type_id是外键):
class ElementField extends Model {
protected $fillable = ['api', 'element_field_type_id', 'label', 'type'];
public function type() {
return $this->hasOne('App\Models\ElementFieldType');
}
}在找到ElementField之后,在我的控制器中,我希望使用以下方法访问sql_type:
$field = ElementField::find($id);
echo $field->type->sql_type;但是我得到了下面的错误,这意味着我可以告诉你,ElementFieldType中应该有一个ElementFieldType键,但这是不对的。
我做错了什么?
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'element_field_types.element_field_id'
in 'where clause' (SQL: select `sql_type` from `element_field_types`
where `element_field_types`.`element_field_id` = 1 and `element_field_types`.`element_field_id`
is not null limit 1)数据库转储:
CREATE TABLE `element_fields` (
`id` int(10) UNSIGNED NOT NULL,
`element_field_type_id` int(10) UNSIGNED NOT NULL,
`api` varchar(255) NOT NULL,
`label` varchar(255) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `element_field_types` (
`id` int(10) UNSIGNED NOT NULL,
`name` varchar(255) NOT NULL,
`sql_type` varchar(255) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `element_fields`
ADD PRIMARY KEY (`id`),
ADD KEY `element_fields_element_field_type_id_foreign` (`element_field_type_id`),
ADD KEY `element_fields_element_field_type_id_index` (`element_field_type_id`);
ALTER TABLE `element_field_types`
ADD PRIMARY KEY (`id`);
ALTER TABLE `element_fields`
ADD CONSTRAINT `element_fields_element_field_type_id_foreign` FOREIGN KEY (`element_field_type_id`) REFERENCES `element_field_types` (`id`);发布于 2016-02-01 20:04:15
我需要用belongsTo而不是hasOne来实现我想要的功能:
class ElementField extends Model {
protected $fillable = ['api', 'element_field_type_id', 'element_id', 'label', 'explanation', 'type', 'mandatory'];
public function type() {
return $this->belongsTo('App\Models\ElementFieldType', 'element_field_type_id');
}
}现在有了$field->type->sql_type,我就得到了我想要的
发布于 2016-01-29 19:33:03
你应该用关系把你的外键传递给别人。试着改变你在模型中的关系,比如:
public function type() {
return $this->hasOne('App\Models\ElementField', 'element_field_type_id');
}您可以在这里阅读更多关于https://laravel.com/docs/5.1/eloquent-relationships#one-to-one的信息。
发布于 2016-01-29 20:13:33
在第一个表中,您的查询没有什么可链接的,您需要在ElementField中引用ElementFieldType,因为下面没有什么可链接到的。
因此,尝试将id字段关系添加到ElementFieldType表中:
element_fields_id所以在打电话时:
public function type() {
return $this->hasOne('App\Models\ElementFieldType');
}它现在有一个钩子来调用ElementFieldType表。因为这样做的是获取当前的表名并将id添加到其中,所以它将查找字段:element_fields_id
因此,模式应该是:
CREATE TABLE `element_field_types` (
`id` int(10) UNSIGNED NOT NULL,
`element_fields_id` int(10) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
`sql_type` varchar(255) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;所以现在,当调用echo $field->type->sql_type;时,它将在element_field_types表中查找一个名为element_field_types_id的字段,希望这是有意义的,
基本上,您不需要element_field_types_id在另一个表中,而只是另一个表中的element_fields_id字段。
https://stackoverflow.com/questions/35092376
复制相似问题