我开始学习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_typeclass 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)
答案 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
我得到了我想要的东西