首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel 5数据库表关系

Laravel 5数据库表关系
EN

Stack Overflow用户
提问于 2016-01-29 19:19:42
回答 3查看 127关注 0票数 0

我从学习Laravel 5中的数据库表关系开始。作为一个cakePHPer,有些东西的工作方式有点不同。我的第一个测试是这个..。

包含不同sql_types的表:

代码语言:javascript
复制
class ElementFieldType extends Model {

    protected $fillable = ['name', 'sql_type'];

}

表中包含链接到sql_types的ElementFieldType模型中的字段(element_field_type_id是外键):

代码语言:javascript
复制
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:

代码语言:javascript
复制
$field = ElementField::find($id);
echo $field->type->sql_type;

但是我得到了下面的错误,这意味着我可以告诉你,ElementFieldType中应该有一个ElementFieldType键,但这是不对的。

我做错了什么?

代码语言:javascript
复制
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)

数据库转储:

代码语言:javascript
复制
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`);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-01 20:04:15

我需要用belongsTo而不是hasOne来实现我想要的功能:

代码语言:javascript
复制
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,我就得到了我想要的

票数 0
EN

Stack Overflow用户

发布于 2016-01-29 19:33:03

你应该用关系把你的外键传递给别人。试着改变你在模型中的关系,比如:

代码语言:javascript
复制
public function type() {
    return $this->hasOne('App\Models\ElementField', 'element_field_type_id');
}

您可以在这里阅读更多关于https://laravel.com/docs/5.1/eloquent-relationships#one-to-one的信息。

票数 0
EN

Stack Overflow用户

发布于 2016-01-29 20:13:33

在第一个表中,您的查询没有什么可链接的,您需要在ElementField中引用ElementFieldType,因为下面没有什么可链接到的。

因此,尝试将id字段关系添加到ElementFieldType表中:

代码语言:javascript
复制
  element_fields_id

所以在打电话时:

代码语言:javascript
复制
  public function type() {
    return $this->hasOne('App\Models\ElementFieldType');
}

它现在有一个钩子来调用ElementFieldType表。因为这样做的是获取当前的表名并将id添加到其中,所以它将查找字段:element_fields_id

因此,模式应该是:

代码语言:javascript
复制
   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字段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35092376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档