Отношения Laravel, кажется, не работают

У меня есть объекты Item и AdvertItem в Laravel. Я хочу создать отношение 1 к 1 между элементом и элементом рекламы

Класс предмета выглядит так

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Item extends Model
{
    //
    public function Category(){
        return $this->belongsTo(Category::class);
    }

    public function Currency(){
        return $this->hasOne(Currency::class);
    }

    public function AdvertItem(){
        return $this->hasOne(AdvertItems::class);
    }
}

и класс AdvertItem выглядит так

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class AdvertItems extends Model
{
    protected $guarded = [];

    //
    public function items(){
        return $this->belongsTo(Item::class);
    }
}

но когда я вызываю AdvertItem, я вижу только item_id = 1 вместо объекта item.

Таблица предметов создается так

 class CreateItemsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('items', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('description');
            $table->unsignedBigInteger('currency_lookup_id');
            $table->unsignedBigInteger('category_id')->index();
            $table->unsignedBigInteger('price');
            $table->string("image_path");
            $table->string('sale_ind');
            $table->Date('eff_from');
            $table->Date('eff_to');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('item');
    }
}

И таблица объявлений создается вот так

class CreateAdvertItemsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('advert_items', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('item_id');
            $table->unsignedBigInteger('customer_id');
            $table->Date('eff_from');
            $table->Date('eff_to');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('advert_items');
    }
}

Пожалуйста помогите.

1 ответ

Решение

Следующие правила помогут вам.

  • Всегда начинайте имена отношений с нижнего регистра. Сохраняйте заглавные буквы для классов, а не методов.

  • Модели должны быть единичными

  • Обратите внимание на множественность имен. Вещи, из которых должно быть только одно, должны быть единичными. Итак, в ваших отношениях 1:1 оба названия отношений должны быть в единственном числе.

AdvertItem класс

    public function item(){
        return $this->belongsTo(Item::class);
    }

тогда, если у вас есть Item и вы хотите AdvertItem, вам следует load Это

$item->load('advertitem');

или наоборот

$advertItem->load('item');
Другие вопросы по тегам