【问题标题】:Eloquent models comparation troublesEloquent 模型比较麻烦
【发布时间】:2018-12-06 15:30:03
【问题描述】:

在这样的用例中,我对雄辩的模型有一些困难:

$skill1 = new Skill();
$skill1->title = "Test";
$skill1->save();

$skill3 = Skill::findOrFail($skill1->id);

$this->assertEquals($skill1, $skill3);

断言会出错,因为对象不相等 Comparasion result here 如果我们从关系中获取对象,则会有很多新字段(例如 original->relation)

我知道,Eloquent 模型中有 "is" 方法并且它工作正常,但是如果我需要使用像 in_array 这样的核心 PHP 函数(例如,它在 Collection 的 "contains" 方法中使用),比较不会工作。

问题是“如何比较这两个模型并像这样使用它:”

$this->assertTrue(collect([$skill1])->contains($skill3));

也许我可以重载比较运算符,也许我可以在 C# 中像 IComparable 一样制作 smthng?

谢谢。

【问题讨论】:

  • 使用$this->assertEquals(),您只能检查单个值。请尝试$this->assertSame()
  • 两个模型何时相等?当他们的所有属性都匹配时?还是只是 ID?
  • 在我看来,模型是平等的,当所有属性都匹配时。

标签: php laravel laravel-5 activerecord eloquent


【解决方案1】:

比较属性,而不是整个模型:

$this->assertEquals($skill1->getAttributes(), $skill3->getAttributes());

如果您将新创建的模型与数据库中的模型进行比较,$wasRecentlyCreated 是不同的(除其他外)。

【讨论】:

  • 您能否就答案提供反馈?
  • 对不起,但这并不完全是我所需要的。主要目标不是通过测试,而是在语义上使用集合的方法。我认为唯一的方法是使用模型的“is”方法重写这些方法
猜你喜欢
  • 2011-01-18
  • 2012-11-05
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
相关资源
最近更新 更多