为什么从 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);

然而,许多关系操作很难用它来完成,然后只获取具有所有属性的模型就可以了。