Php 使用Laravel factory()->create()后对对象伴侣的混淆

Php 使用Laravel factory()->create()后对对象伴侣的混淆,php,laravel,Php,Laravel,当比较从factory->create方法返回的对象时,我得到了奇怪的结果。下面的php artisan tinker粘贴展示了我的体验 >>> $game1 = factory(App\Game::class)->create(); => App\Game {#2909 title: "Macey Rogahn", image_location: "Julio Hoppe/fake/path/image.img", updated_a

当比较从factory->create方法返回的对象时,我得到了奇怪的结果。下面的php artisan tinker粘贴展示了我的体验

>>> $game1 = factory(App\Game::class)->create();
=> App\Game {#2909
     title: "Macey Rogahn",
     image_location: "Julio Hoppe/fake/path/image.img",
     updated_at: "2018-08-29 02:45:40",
     created_at: "2018-08-29 02:45:40",
     id: 10,
   }
>>> $game2 = App\Game::first();
=> App\Game {#2906
     id: 10,
     created_at: "2018-08-29 02:45:40",
     updated_at: "2018-08-29 02:45:40",
     title: "Macey Rogahn",
     image_location: "Julio Hoppe/fake/path/image.img",
   }
>>> $game1 == $game2
=> false

我不明白为什么这个结果是假的。值相等,但php在比较时返回false。这也导致在测试期间使用Collection->diff时出现问题。我的PHP水平一般,有人能解释这种行为吗?

即使两个对象都引用同一个域模型,但它们以不同的方式实例化,因此,从PHP的角度来看,它们是不同的对象

通过查看tinker的输出,您可以很容易地发现这一点。即使两者都有一个值为10的属性id,它们也有不同的PHP对象id 2909和2906

调用App\Game::时,首先,Eloquent连接到数据库,获取数据,创建新对象,然后用数据库值填充对象属性。既然你是好的,雄辩是创造一个新的对象,他们不是同一个实例

当您比较objects==PHP时,它不知道它们是有说服力的模型,而只是普通的PHP对象,并且它们不指向相同的内存区域

例如,如果要比较模型,则必须比较它们的ID,或者在基础模型中创建特定的逻辑

// file: App/Model.php
abstract class Model extends Eloquent {

    public function isSameAs(\App\Model $model):bool {
        return $this->id !== null and $this->id === $model->id;
    }
}

// file: App/Game.php
class Game extends Model {

}
你能做的事

$game1->isSameAs($game2);
注意,我故意使用isSameAs而不是isEqualTo,因为您没有比较模型的每个属性,因此即使它们具有相同的ID,它们也可能不是相等的模型