Красноречивые отношения Laravel не дают результатов - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь сделать табличные отношения с laravel (5.6) красноречивыми.И я не могу получить результаты реляционной таблицы из модели.Ниже я упомянул отношение.

отношение: пункт имеет одну категорию

Это моя модель товара

class InventoryItems extends Model
{
    /**
     * table row delete
     */
    use SoftDeletes;

    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'inventory_items';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $guarded = ['id'];

    protected $fillable = ['name','type_id','category_id','sub_category_id','description','cost_price','sale_price','image_path','image','store_id','status'];


    public function category()
    {
        return $this->belongsTo('App\ItemCategories', 'id', 'category_id');
    }
}

Это моя модель категории

class ItemCategories extends Model
{
    /**
     * table row delete
     */
    use SoftDeletes;

    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'item_categories';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $guarded = ['id'];

    protected $fillable = ['name'];
}

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

 public function index(Request $request)
    {
        $items = InventoryItems::all();

        dd($items);

    }

Это результат

Collection {#722 ▼
  #items: array:2 [▼
    0 => InventoryItems {#719 ▼
      #table: "inventory_items"
      #guarded: array:1 [▶]
      #fillable: array:11 [▼
        0 => "name"
        1 => "type_id"
        2 => "category_id"
        3 => "sub_category_id"
        4 => "description"
        5 => "cost_price"
        6 => "sale_price"
        7 => "image_path"
        8 => "image"
        9 => "store_id"
        10 => "status"
      ]
      #connection: "mysql"
      #primaryKey: "id"
      #keyType: "int"
      +incrementing: true
      #with: []
      #withCount: []
      #perPage: 15
      +exists: true
      +wasRecentlyCreated: false
      #attributes: array:15 [▼
        "id" => 1
        "name" => "Dell Keyboard"
        "type_id" => 1
        "category_id" => 1
        "sub_category_id" => 1
        "description" => "<p>test key</p>"
        "cost_price" => 100.0
        "sale_price" => 500.0
        "image_path" => null
        "image" => null
        "store_id" => 1
        "status" => 1
        "created_at" => "2018-06-02 14:31:32"
        "updated_at" => "2018-06-02 14:31:32"
        "deleted_at" => null
      ]
      #original: array:15 [▶]
      #changes: []
      #casts: []
      #dates: []
      #dateFormat: null
      #appends: []
      #dispatchesEvents: []
      #observables: []
      #relations: []
      #touches: []
      +timestamps: true
      #hidden: []
      #visible: []
      #forceDeleting: false
    }

Я новичок в красноречивых отношениях, и я сослался на документацию laravel и некоторые другие учебные пособия, но это не помогло.Должно быть, глупая ошибка.

Ответы [ 2 ]

0 голосов
/ 23 июня 2018

Есть несколько вещей, происходящих.

Во-первых, Laravel использует 'Eager Loading' при работе с модельными отношениями.

Из документации.(https://laravel.com/docs/5.6/eloquent-relationships#eager-loading)

Это означает, что данные отношений фактически не загружаются до тех пор, пока вы не получите первый доступ к свойству. Однако Eloquent может «загружать» отношения во время запроса родительской модели.

Это означает, что Laravel не загрузит ваши отношения, пока вы не попытаетесь получить к ним доступ.

Например, следующий код лениво загрузит категорию.

foreach (InventoryItems::all() as $inventoryItem) {
    dump($inventoryItem->category); // Laravel loads the category here and not before
}

Вы также можете загружать отношения, когда извлекаете саму модель.

$items = InventoryItems::all()->load('category'); // Laravel loads the category here.

dd($items);

Единственное, что здесь следует отметить, это то, что при загрузке вы должны использовать функцию имени отношения, а не имя модели, которую выполучение.

, если отношение вашей категории было определено как

public function itemCategory()

Вы бы использовали

InventoryItems::all()->load('itemCategory');

Следует упомянуть, что -> load () работает толькодля коллекций, а не для строителей.

для строителей, которые вам нужно использовать -> с ()

например

InventoryItems::all()->load('category'); // all() has already returned a collection so we have to 'load' additional data

InventoryItems::where('condition','=','something')->with('category')->get(); // This is a builder (until we call get() or first()) so we can ask for the data to be delivered 'with' the category to the collection
0 голосов
/ 23 июня 2018

Сначала попробуйте добавить в свой контроллер with('category'), чтобы красноречивый знал, что вы называете отношения.поэтому ваш контроллер должен выглядеть так:

public function index(Request $request)
    {
        $items = InventoryItems::with('category')->get();

        dd($items);

    }

Во-вторых, я думаю, что порядок следования ключей неверен, это должно быть

return $this->belongsTo('YourModel','foreing_key','other_model_key')

, поэтому ваши отношения должны выглядеть следующим образом

return $this->belongsTo('App\ItemCategories', 'category_id', 'id');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...