为什么从 Laravel 中的另一个方法调用后查询结果突然改变
Why query result suddenly changed after called from other medthod in Laravel
我对来自 Eloquent 的查询结果有疑问,我尝试从数据库查询并在我的 mount()
方法中放入变量 $contractList
,结果如预期。但是当我尝试使用 $contractList->find($id)
从 $contractList
检索特定数据时,结果与 mount()
方法中的结果不同。
这是来自 mount() 的查询:
public function mount(){
$contractList = Kontrak::select(['id', 'mou_id'])->with(['order:id,kontrak_id', 'order.worklist:id', 'order.worklist.khs:id,mou_id,worklist_id,khs', 'amdNilai:id,kontrak_id,tgl_surat'])->withCount('amdNilai')->get()
}
结果如下:
但是当我试图从 $contractList
中查找特定数据时,显示的属性与 mount 中的属性不同:
public function itemSelected($id)
{
//amd_nilai_count not showing
$kontrak = $this->contractList->find($id);
if ($kontrak->amd_nilai_count == 1) {
$this->nilai_amd = $this->calculateNilai($id);
}
}
这是从 itemSelected() 调用的结果:
我尝试使用 get() 但结果仍然存在问题,如何获得与 mount()
中相同的属性。顺便说一句,我使用 laravel 和 livewire。
当我阅读您的评论时,您似乎混淆了 ActiveRecords ORM 和 Data Mapper ORM。 Laravel
使用活动记录。
Laravel
将始终在每次数据操作时获取模型。
Kontrak::select('name')->find(1); // select name from kontraks where id = 1;
Kontrak::find(1); // select * from kontraks where id = 1;
无论如何,这将始终执行两次 SQL
调用,并且堆上的对象将不相同。如果你使用 Doctrine
或类似的,这会有所不同。
为了解决这个问题,您通常会将您的逻辑放在服务或类似的地方。
class KontrakService
{
public function find(int $id) {
return Kontrak::select(['id', 'mou_id'])->find($id);
}
}
只要您需要相同的逻辑,就使用该服务。
resolve(KontrakService::class)->find(1);
然而,许多关系操作很难用它来完成,然后只获取具有所有属性的模型就可以了。
我对来自 Eloquent 的查询结果有疑问,我尝试从数据库查询并在我的 mount()
方法中放入变量 $contractList
,结果如预期。但是当我尝试使用 $contractList->find($id)
从 $contractList
检索特定数据时,结果与 mount()
方法中的结果不同。
这是来自 mount() 的查询:
public function mount(){
$contractList = Kontrak::select(['id', 'mou_id'])->with(['order:id,kontrak_id', 'order.worklist:id', 'order.worklist.khs:id,mou_id,worklist_id,khs', 'amdNilai:id,kontrak_id,tgl_surat'])->withCount('amdNilai')->get()
}
结果如下:
但是当我试图从 $contractList
中查找特定数据时,显示的属性与 mount 中的属性不同:
public function itemSelected($id)
{
//amd_nilai_count not showing
$kontrak = $this->contractList->find($id);
if ($kontrak->amd_nilai_count == 1) {
$this->nilai_amd = $this->calculateNilai($id);
}
}
这是从 itemSelected() 调用的结果:
我尝试使用 get() 但结果仍然存在问题,如何获得与 mount()
中相同的属性。顺便说一句,我使用 laravel 和 livewire。
当我阅读您的评论时,您似乎混淆了 ActiveRecords ORM 和 Data Mapper ORM。 Laravel
使用活动记录。
Laravel
将始终在每次数据操作时获取模型。
Kontrak::select('name')->find(1); // select name from kontraks where id = 1;
Kontrak::find(1); // select * from kontraks where id = 1;
无论如何,这将始终执行两次 SQL
调用,并且堆上的对象将不相同。如果你使用 Doctrine
或类似的,这会有所不同。
为了解决这个问题,您通常会将您的逻辑放在服务或类似的地方。
class KontrakService
{
public function find(int $id) {
return Kontrak::select(['id', 'mou_id'])->find($id);
}
}
只要您需要相同的逻辑,就使用该服务。
resolve(KontrakService::class)->find(1);
然而,许多关系操作很难用它来完成,然后只获取具有所有属性的模型就可以了。