Я занимаюсь разработкой системы, которая расширяет существующую систему ERP, и, таким образом, осуществляет доступ к двум базам данных (обе на одном и том же MS SQL Server).Я пытаюсь получить доступ к элементам в модели «Оборудование» (это таблица в базе данных ERP) через модель «EquipmentInstance» из модели «Тип оборудования» (эти два в новой базе данных).Они соотносятся согласно этой схеме:
![ER diagram depicting relationship](https://i.stack.imgur.com/zbPdb.png)
Три модели следующие:
Тип оборудования
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 ()?