Php 使用Laravel factory()->create()后对对象伴侣的混淆
当比较从factory->create方法返回的对象时,我得到了奇怪的结果。下面的php artisan tinker粘贴展示了我的体验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
>>> $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,它们也可能不是相等的模型