Пустой объект в красноречивом принадлежит()

#laravel #eloquent #laravel-blade

#ларавель #красноречивый #ларавель-лезвие

Вопрос:

Я пытаюсь отобразить, какой из атрибутов ( code ) элемента. ServiceItem содержит элемент в качестве внешнего ключа. Но я вообще не могу достать этот Предмет.

Это дает пустой объект в шаблоне лезвия:

 @foreach ($service-gt;serviceItems as $serviceItem )  {{ json_encode($serviceItem-gt;item()) }} @endforeach  

введите описание изображения здесь

Вот моя типовая декларация:

 //ServiceItem model class ServiceItem extends Model {  use HasFactory;  public $fillable = ['service_id', 'item_id', 'values'];   public function service()  {  return $this-gt;belongsTo(Service::class, 'foreign_key');  }   // this doesn't work  public function item()  {  return $this-gt;belongsTo(Item::class, 'foreign_key');  } }  // Service model class Service extends Model {  use HasFactory;  public $fillable = ['user_id', 'site_id', 'title', 'status', 'remarks', 'report', 'date'];   public function user()  {  return $this-gt;belongsTo('AppModelsUser');  }   public function site()  {  return $this-gt;belongsTo('AppModelsSite');  }   public function serviceItems() {  return $this-gt;hasMany('AppModelsServiceItem');  }  }   

Это мой контроллер:

 public function index() {  $services = Service::latest()-gt;paginate(5);  return view('services.index', compact('services'))  -gt;with('i', (request()-gt;input('page', 1) - 1) * 5); }  

Пожалуйста, помогите мне отобразить code атрибут в товаре из сервиса!!! Большое спасибо!

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

1. вы будете использовать динамическое свойство $serviceItem-gt;item , а не метод для доступа к связи; метод вернет объект построителя отношений , а не результат … но динамическое свойство может вернуться null , так как Принадлежит может вернуть модель или null

Ответ №1:

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

 class ServiceItem extends Model {  use HasFactory;  public $fillable = ['service_id', 'item_id', 'values'];   public function service()  {  return $this-gt;belongsTo(Service::class, 'service_id');  }   public function item()  {  return $this-gt;belongsTo(Item::class, 'item_id');  } }  

и тогда $serviceItem-gt;item все должно сработать так, как ожидалось.

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

1. Спасибо, это работает! Таким образом, вторым параметром функции belongsTo() должно быть имя столбца таблицы, верно?

2. да, это верно.