1 Вопрос: Как получить данные из вложенных отношений Laravel?

вопрос создан в Thu, May 2, 2019 12:00 AM

Я новичок в 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
  }
}

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

    
2
  1. Пожалуйста, отправьте свой код в текстовом формате вместо изображения.
    2019-05-02 14: 58: 32Z
  2. Каков результат того, что вы пробовали до сих пор?
    2019-05-02 15: 01: 40Z
  3. Спасибо за ваши ответы. Код был обновлен. Пожалуйста, посмотрите
    2019-05-02 15: 17: 21Z
1 ответ                              1                         

Для вас было бы проще, если бы ваши записи были 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 в этом случае.

    
1
2019-05-02 15: 41: 39Z
  1. Я сделал именно то, что вы сказали, но получаю эту ошибку. Illuminate \ Database \ QueryException (42S22) SQLSTATE[42S22]: Column not found: 1054 Unknown column 'slabs.slab_ID' in 'where clause' (SQL: select * from slabs`, где slabs.slab_ID in (10, 26)) `
    2019-05-02 15: 33: 42Z
  2. Я обновил свой ответ, у меня был неправильный ответ.
    2019-05-02 15: 35: 21Z
  3. Это не имеет смысла. Третий аргумент будет inventory_ID, если что-нибудь. То, как вы его настроите, будет для отношения belongsTo.
    2019-05-02 15: 43: 24Z
  4. Я действительно борюсь с английским сегодня, я знаю, что я пытаюсь сказать, я просто не могу получить его. Вы уверены, что это не будет slab_ID, иначе как Laravel узнает имя столбца?
    2019-05-02 15: 46: 07Z
  5. @ swonder Спасибо за вашу помощь. Моя проблема была решена. Большое спасибо.
    2019-05-02 15: 52: 28Z
источник размещен Вот