Как получить данные из вложенных отношений Laravel? - PullRequest
2 голосов
/ 02 мая 2019

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

Требуемое поведение выглядит следующим образом:

У меня есть 5 моделей. Purchase, Inventory, Slab, Scarting и FloorTile.

У меня есть отношение один к одному между моделями покупки и инвентаризации, в то время как запасы дополнительно связаны с плитой, вырубкой и плиткой.

У меня есть идентификатор покупки, и я хочу получить данные из таблицы inventory, затем получить slab_id, scarting_id или floorTile_id из таблицы inventory и получить данные из соответствующей таблицы.

slab_id, scarting_id и floorTile_id могут быть кратны inventory id.

Я не знаю, как получать данные на каждой итерации.

Модель покупки:

<?php

namespace App;
use App\Inventory;

use Illuminate\Database\Eloquent\Model;

class Purchase extends Model
{
    public function inventory()
    {
        return $this->hasOne('App\Inventory');
    }

}

Модель инвентаря:

<?php

namespace App;
use App\Slab;
use App\Scarting;
use App\FloorTile;
use App\Purchase;
Use App\StandardSize;

use Illuminate\Database\Eloquent\Model;

class Inventory extends Model
{
    public function purchase()
    {
        return $this->belongsTo('App\Purchase');
    }

    public function standatdSize()
    {
        return $this->hasOne('App\StandardSize');
    }

    public function slab()
    {
        return $this->hasOne('App\Slab');
    }

    public function scarting()
    {
        return $this->hasOne('App\Scarting');
    }

    public function floorTile()
    {
        return $this->hasOne('App\FloorTile');
    }
}

Я пробовал это:

$purchase = Purchase::where('factoryName', $factoryName)->with('inventory.slab')->get();

Результат выглядит следующим образом:

{
  "id": 36,
  "fname": "Sama",
  "lname": "Jojo",
  "factoryName": "Sama Inc.",
  "cnic": "3216542",
  "area": "Johar town",
  "city": "Lahore",
  "province": "Punjab",
  "phone1": "45678912345",
  "phone2": "45678912345",
  "inventory_ID": 10,
  "created_at": "2019-03-19 12:11:45",
  "updated_at": "2019-03-19 12:11:45",
  "inventory": {
    "id": 10,
    "purchase_id": 36,
    "marbleType": "1",
    "totalSquareFt": 25,
    "priceperSquareFt": 230,
    "totalPurchasePrice": 25000,
    "standardSize_ID": "5",
    "salePrice": 250,
    "miliMeter": "6mm",
    "slab_ID": 1,
    "scarting_ID": null,
    "floorTile_ID": null,
    "created_at": "2019-03-19 12:11:45",
    "updated_at": "2019-03-19 12:11:45",
    "slab": null
  }
}

Даже есть данные, доступные для плиты, но они все еще показывают NULL.

1 Ответ

1 голос
/ 02 мая 2019

Вам было бы легче, если бы ваши записи были slab_id, а не slab_ID таким образом Laravel сделал бы это для вас, однако вы не выполнили соглашение об именовании Laravel, которое хорошо, но вы ' Я должен сказать Laravel, что вы используете свои собственные соглашения об именах, и он поднимет его просто отлично. Я привел пример ниже.

public function slab()
{
    return $this->hasOne('App\Slab', 'id', 'slab_ID');
}

$this->hasOne('App\Model', 'foreign_key', 'local_key');

Внешний ключ - это первичный ключ модели, которую вы пытаетесь получить, а local_key - это ссылка на то, как он называется в этой модели, обычно model_id и в этом случае будет slab_ID.

local_key = $this->id и foreign_key = App\Slab в этом случае.

...