Возвращает только один столбец из Laravel имеет одно отношение

#laravel

Вопрос:

Я создаю пользовательские поля формы и в одной таблице сохраняю типы полей, например:

 CustomFieldTypes ------------------------------- id | type | common_name ------------------------------- 1 | v-text-area | TextArea -------------------------------  

Затем в другой таблице я сохраняю сведения о созданном пользовательском поле, например:

 PageCustomFields ---------------------------------------------------------- id | page_id | custom_field_type_id | label | is_required ---------------------------------------------------------- 2 | 2 | 1 | Name | false ----------------------------------------------------------  

Когда я получаю модель PageCustomFields, я хочу включить ТОЛЬКО поле «тип» пользовательского типа, мне не нужно другое поле. Как я могу этого добиться? Я пробовал что-то подобное в модели PageCustomFields, но, похоже, это не работает:

 public function customFieldType(){  return $this-gt;hasOne(CustomFieldType::class, "id", "custom_field_type_id")-gt;select('type'); }  

Есть какие-нибудь советы? Спасибо!

ИЗМЕНИТЬ: Чтобы уточнить, я хотел бы, чтобы атрибуты модели конечных полей страниц выглядели примерно так после извлечения поля типа CustomFieldTypes:

 PageCustomFields ------------------------------------------------------------------------------ id | page_id | custom_field_type | custom_field_type_id | label | is_required ------------------------------------------------------------------------------ 2 | 2 | v-text-area | 1 | Name | false ------------------------------------------------------------------------------  

Ответ №1:

Из моей головы; это работает?

 public function customFieldType(){  return $this-gt;hasOne(CustomFieldType::class, "id", "custom_field_type_id")-gt;type; } 

Если нет, предполагая, что вы используете Vue в качестве интерфейса, возможно, вы могли бы использовать ресурсы Laravel для фильтрации только той информации, которая вам нужна.

Комментарии:

1. К сожалению, это не работает, он возвращает ошибку «Неопределенное свойство»

Ответ №2:

Я думаю, что ваши отношения должны быть:

 public function customFieldType(){  return $this-gt;belongsTo(CustomFieldType::class, "custom_field_type_id"); }  

Я предпочитаю определять отношения без ограничений, а затем применять необходимые ограничения в коде контроллеров:

 $value=PageCustomField::with('customFieldType:id,type')-gt;get();  

примечание. при этом будет выбрано только id (необходимо для загрузки) и type .

в любом случае , если вы хотите, чтобы это было так, вы можете использовать addSelect:

 public function customFieldType(){  return $this-gt;belongsTo(CustomFieldType::class, "custom_field_type_id")-gt;addSelect(['CustomFieldTypes.id','CustomFieldTypes.type']);  }  

и если вы хотите, чтобы это было как обычно, выберите без вложенности, вы можете присоединиться к таблицам:

 $values=PageCustomField::join('CustomFieldTypes','PageCustomFields.custom_field_type_id','=','CustomFieldTypes.id')-gt;select('CustomFieldTypes.*') -gt;addSelect(['type']);  

Комментарии:

1. Делать это с помощью контроллеров нормально, но я бы предпочел не делать этого каждый раз, когда я извлекаю модель PageCustomField. Поэтому я хотел бы, чтобы тип всегда включался в модель PageCustomField независимо от того, где к нему осуществляется доступ, поэтому я пытаюсь получить доступ к пользовательскому типу поля непосредственно в модели

2. хорошо, вы можете попробовать добавить выбор, как в обновленном ответе

3. Это, кажется, работает нормально, спасибо, но из любопытства, можно ли просто выбрать значение «тип» и установить его в качестве поля «CustomFieldType» в модели PageCustomField без вложенности? Т. Е. Вместо этого customFieldType = [ 'id' =gt; 1, 'type' =gt; 'v-textarea' ] можно ли просто установить customFieldType = 'v-textarea' в модели PageCustomField? Надеюсь, в этом есть смысл 🙂

4. Я отредактировал свой вопрос, чтобы было немного яснее, как я хочу, чтобы данные отображались

5. хорошо, вы можете попробовать объединить таблицы, как в обновленном ответе