Laravel 5数据库表关系
我从学习Laravel 5中的数据库表关系开始。作为一个酒鬼,有些东西只是起到了一点不同的作用。我的第一个测试是 包含不同sql\u类型的表:Laravel 5数据库表关系,laravel,laravel-5,Laravel,Laravel 5,我从学习Laravel 5中的数据库表关系开始。作为一个酒鬼,有些东西只是起到了一点不同的作用。我的第一个测试是 包含不同sql\u类型的表: class ElementFieldType extends Model { protected $fillable = ['name', 'sql_type']; } 包含链接到ElementFieldType模型中sql类型的字段的表(element\u field\u type\u id是外键): 在我的控制器中,在找到Element
class ElementFieldType extends Model {
protected $fillable = ['name', 'sql_type'];
}
包含链接到ElementFieldType模型中sql类型的字段的表(element\u field\u type\u id是外键):
在我的控制器中,在找到ElementField后,我想使用以下方式访问sql_类型:
$field = ElementField::find($id);
echo $field->type->sql_type;
但我得到了下面的错误,这意味着我可以告诉你们,在ElementFieldType中应该有一个element\u field\u id键,但这不可能是正确的
我做错了什么
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`);
您应该将外键传递给关系。尝试在模型中更改您的关系,如以下所示:
public function type() {
return $this->hasOne('App\Models\ElementField', 'element_field_type_id');
}
您可以在此处阅读更多信息您查询的内容没有任何链接。在第一个表中,您需要在
ElementFieldType
中引用ElementField
,因为以下内容没有任何链接
因此,请尝试将id字段关系添加到ElementFieldType
表中:
element_fields_id
因此,打电话时:
public function type() {
return $this->hasOne('App\Models\ElementFieldType');
}
它现在有一个钩子来调用ElementFieldType
表。这样做的目的是获取当前表名并向其添加id,因此它将查找字段:element\u fields\u 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\u type
它将在元素字段类型
表中查找名为元素字段类型
的字段,希望这是有意义的
基本上你不需要
element\u field\u types\u id
在另一个选项卡中,只需要element\u fields\u id
字段在另一个选项卡中。我需要使用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\u type
我得到了我想要的东西我以前尝试过,但是得到了这个错误SQLSTATE[42S22]:Column not found:1054未知列'element\u field\u types.element\u field\u type\u id'在'where子句'(SQL:select*from
element\u field\u types`其中element\u field\u types
element\u field\u type\u id
=1和element\u field\u types
element\u field\u type\u id不为空限制1)`你能发布你的数据库模式吗?将它添加到问题中。Thanx提前,你可能需要将你的关系移动到ElementField。看看我的答案。另外,你不需要在受保护的$Fillable中使用外键'element\u field\u type\u id'。事实是,FieldType与categories类似,FieldType与products类似。因此,产品属于c分类和类别有很多产品。你是说,当我在产品级别时,我无法通过此链接获取类别信息?我必须进行两个单独的查询才能获取字段类型信息?问题是,字段类型的行为类似于类别,字段类似于产品。因此,产品属于类别,类别有很多产品cts。您的意思是,当我处于产品级别时,我无法通过此链接获取类别信息?我必须进行两次单独的查询才能获取字段类型信息?您自己就解决了这个问题,这样做总是很好:-)
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');
}
}