Как вы можете использовать Eloquent для поиска связанных значений в двух таблицах и в другой базе данных? - PullRequest
0 голосов
/ 16 апреля 2019

Я занимаюсь разработкой системы, которая расширяет существующую систему ERP, и, таким образом, осуществляет доступ к двум базам данных (обе на одном и том же MS SQL Server).Я пытаюсь получить доступ к элементам в модели «Оборудование» (это таблица в базе данных ERP) через модель «EquipmentInstance» из модели «Тип оборудования» (эти два в новой базе данных).Они соотносятся согласно этой схеме:

ER diagram depicting relationship

Три модели следующие:

Тип оборудования

namespace App;

use Illuminate\Database\Eloquent\Model;

class EquipmentType extends Model
{
    protected $table = 'dbo.EquipmentType';
    protected $connection = 'sqlsrv';
    protected $primaryKey = 'EquipmentTypeID';
    protected $fillable = [
        'TypeName',
        'ProductManager'
        ];

    public function EquipmentInstance()
    {
        return $this->hasMany(EquipmentInstance::class,'EquipmentTypeID', 'EquipmentTypeID');
    }

    public function Equipment()
    {
        return $this->hasManyThrough(
            Equipment::class,
            EquipmentInstance::class,
            'TypeID',
            'PartNum',
            'TypeID',
            'PartNum'
        );
    }
}

EquipmentInstance

namespace App;

use Illuminate\Database\Eloquent\Model;

class EquipmentInstance extends Model
{
    protected $table = 'dbo.EquipmentInstance';
    protected $primaryKey = 'EquipmentID';
    protected $keyType = 'string';
    protected $connection = 'sqlsrv';
    protected $fillable = [
        'EquipmentID',
        'EquipmentTypeID',
        'PartNum'
    ];

    public function Part()
    {
        return $this->belongsTo(Part::class,'PartNum','PartNum');
    }

    public function Equipment()
    {
        return $this->hasMany(Equipment::class,'PartNum', 'PartNum');
    }

    public function EquipmentType()
    {
        return $this->belongsTo(EquipmentType::class); /*,'EquipmentTypeID', 'EquipmentTypeID'*/
    }


/*    public function Attribute()
    {
        return $this->belongsTo(Equipment::class,'SerialNumber', 'JobNum');
    }

    public function TechNote()
    {
        return $this->belongsTo(Equipment::class,'SerialNumber', 'JobNum');
    }*/

}

Equipment

namespace App;

use Illuminate\Database\Eloquent\Model;

class Equipment extends Model
{
    protected $table = 'ERP.SerialNo';
    public $timestamps = false;
    protected $primaryKey = 'SerialNumber';
    protected $keyType = 'string';
    protected $connection = 'epicor';


    public function Part()
    {
        return $this->belongsTo(Part::class,'PartNum','PartNum');
    }

    public function Customer()
    {
        return $this->belongsTo(Customer::class,'CustNum', 'CustNum');
    }

    public function Equipment()
    {
        return $this->belongsTo(Equipment::class,'SerialNumber', 'JobNum');
    }

    public function EquipmentInstance()
    {
        return $this->belongsTo(EquipmentInstance::class,'PartNum', 'PartNum');
    }
}

На контроллере EquipmentType я пытаюсь получить всеоборудования через Экземпляр оборудования, поэтому для каждого Экземпляра оборудования я могу отобразить все Оборудование.

EquipmentType Controller

public function show(EquipmentType $EquipmentType)
{
    $EquipmentInstance = $EquipmentType->EquipmentInstance()
        ->get();

    $Equipments = $EquipmentType->EquipmentInstance()->Equipment()
        ->get();

    return view('EquipmentType.show', compact('EquipmentType', 'EquipmentInstance', 'Equipments'));

}

Сообщение об ошибке, которое я получаю,

"BadMethodCallException
Call to undefined method Illuminate\Database\Eloquent\Relations\HasMany::Equipment()"

Я полагаю, что проблема в том, что (мое понимание нестабильно)что Eloquent пытается написать один запрос для доступа к обеим базам данных, что не удается.Однако я не уверен, как поступить.

Любая помощь будет получена.

Ричард

Обновление

Я реализовал то, что gbalduzzi предложил в своем ответе, что почти сработало, и я уверен, что проблема с моим лезвиемimplemtention.Я вложил два цикла forlops:

@foreach($EquipmentType->EquipmentInstance as $EquipmentInstance)
    @foreach($Equipments as $Equipment)
        <tr>
        <td>{{$EquipmentInstance->PartNum}} - {{$EquipmentInstance->Part->PartDescription}}</td>
         <td><a href="">{{$Equipment->SerialNumber}}</a></td>
         <td>{{$Equipment->SNStatus}}</td>
         <td>{{--{{$Equipment->Customer->LegalName}}--}}</td>
         </tr>
    @endforeach
@endforeach 

, который отображает серийные номера (из модели Equipment) только для первого экземпляра EquipmentInstance и повторяет их для всех экземпляров EquipmentInstanced.

Обновление 2

Я доказал, что проблема с first () в предложенном ответе, как если бы я изменил это на last (), результаты меняются по мере того, как выбудет ожидать (см. обновление 1).Итак, мой вопрос сейчас таков:

Существует ли эквивлант из first (), last (), который есть all () или every ()?

1 Ответ

1 голос
/ 16 апреля 2019

Проблема не в конфигурации вашей базы данных, а в том, как вы называете отношения. Вместо:

$Equipments = $EquipmentType->EquipmentInstance()->Equipment()
    ->get();

использование:

$Equipments = $EquipmentType->EquipmentInstance->first()->Equipment()
    ->get();

Длинный ответ

В Eloquent вы можете использовать отношения двумя способами:

  • как магическое поле (т.е. $EquipmentType->EquipmentInstance). В этом случае вы получите в результате экземпляр модели EquipmentInstance (также, если вы уже запросили его, он напрямую возвращает значение без выполнения нового запроса)

  • как красноречивый запрос (т. Е. $EquipmentType->EquipmentInstance()). Используя его как функцию, вы получаете не модель, а экземпляр RelationShip, который по сути является красноречивым запросом и может быть связан с другими красноречивыми методами, такими как where, orderBy, ecc

Итак, если вы позвоните $EquipmentType->EquipmentInstance()->Equipment(), он выдаст ошибку, потому что красноречивый запрос НЕ имеет отношения Equipment().

С другой стороны, $EquipmentType->EquipmentInstance->Equipment работает, потому что вызывает Equipment для фактического экземпляра модели, для которого правильно определено отношение Equipment.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...