2016-01-29 4 views
0

Я начинаю с изучения связей таблицы базы данных в Laravel 5. Как cakePHPer что-то просто работает немного по-другому. Мой первый тест это ...Связи базы данных Laravel 5

Таблица, содержащая различные 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 должен быть ключ element_field_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`); 

ответ

0

мне нужно сделать это с 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 я получаю именно то, что я хочу

+1

Блестящий вы попали в проблему самостоятельно, всегда хорошо это делать :-) –

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

+0

Я попробовал, что и раньше, но получаю эту ошибку 'SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец 'element_field_types.element_field_type_id' в 'where clause' (SQL: select * from' element_field_types' где 'element_field_types'.'element_field_type_id' = 1 и' element_field_types'.'element_field_type_id' не является нулевым пределом 1) ' –

+0

вы можете опубликовать свой схема базы данных? –

+0

Добавил его на вопрос. Thanx заблаговременно –

0

Вы запрос не имеет ничего сделать ссылку с в первой таблице, необходимо реф в ElementField в пределах ElementFieldType, поскольку следующее не имеет ничего, чтобы зацепить.

Так попробуйте и добавьте отношения полей идентификатора к ElementFieldType таблице:

element_fields_id 

Так что при вызове:

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

Он теперь имеет крюк для вызова на ElementFieldType таблицы. Как что это будет сделать, это взять имя текущей таблицы и добавить идентификатор к нему, так он будет выглядеть на поле: 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 в другой Tabel только element_fields_id поле в другой вместо этого.

+0

Дело в том, что полевые типы действуют как категории и поля, подобные продуктам. Таким образом, продукты относятся к категориям и категориям, которые содержат много продуктов. Что вы говорите, я не могу сделать эту ссылку для получения информации о категории, когда я нахожусь на уровне продукта? Что я должен сделать двумя отдельными запросами, чтобы получить информацию о типе? –

Смежные вопросы