Laravel 5数据库表关系

时间:2016-01-29 19:19:43

标签: laravel laravel-5

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

包含不同sql_types的表:

    Names Category  Date
1  Ashley        A 29/01
7    Mary        M 27/01
4     Bob        A 16/01
5 Charles        M 12/01

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

class ElementFieldType extends Model {

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

}

在找到ElementField后我的控制器中,我想使用:

访问sql_type
class ElementField extends Model {

    protected $fillable = ['api', 'element_field_type_id', 'label', 'type'];

    public function type() {
        return $this->hasOne('App\Models\ElementFieldType');
    }

}

但我得到以下错误,这意味着我可以告诉我,ElementFieldType中应该有一个element_field_id键,但这可能不对。

我做错了什么?

$field = ElementField::find($id);
echo $field->type->sql_type;

数据库转储:

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)

3 个答案:

答案 0 :(得分:0)

您应该通过关系传递外键。尝试在模型中更改您的关系,如下:

public function type() {
    return $this->hasOne('App\Models\ElementField', 'element_field_type_id');
}

您可以在此处详细了解https://laravel.com/docs/5.1/eloquent-relationships#one-to-one

答案 1 :(得分:0)

您的查询无法在第一个表格中链接到任何内容,您需要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字段。

答案 2 :(得分:0)

我需要使用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

现在dnx46我得到了我想要的东西