Даже оба объекта ссылаются на одну и ту же модель предметной области, в которой они создаются по-разному, и поэтому, с точки зрения PHP, они являются разными объектами.
Вы можете легко заметить это, посмотрев на выход тинкера. Даже у обоих есть свойство id
со значением 10, они имеют разные идентификаторы объектов PHP (# 2909 и # 2906)
Когда вы звоните App\Game::first()
, Eloquent подключается к базе данных, извлекает данные, создает новый объект , а затем гидратирует (заполняет) свойства объекта значениями базы данных. Поскольку вы (ну, в общем, Eloquent) создаете новый объект, это не тот же экземпляр.
Когда вы сравниваете объекты (==
), PHP не знает, что они являются моделями Eloquent, а просто обычными объектами 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()
намеренно, потому что вы не сравниваете каждое свойство моделей и, следовательно, даже если они имеют одинаковый идентификатор, они могут быть не равными моделям.