【问题标题】:Laravel Eloquent - relations method is returning HasMany object and property is returning CollectionLaravel Eloquent - 关系方法返回 HasMany 对象,属性返回 Collection
【发布时间】:2021-06-11 12:36:39
【问题描述】:

我有一个简单的问题,但我在网上找不到任何答案。

class Product extends Model
{
    use HasFactory;

    public function variants()
    {
        return $this->hasMany(Variant::class);
    }
}

>>> $p->variants();
=> Illuminate\Database\Eloquent\Relations\HasMany {#4331}
>>> $p->variants;
=> Illuminate\Database\Eloquent\Collection {#4310
     all: [
       App\Models\Variant {#4319
         id: "1",
         name: "VariantOne",
         created_at: null,
         updated_at: null,
         quantity: "2",
         product_id: "1",
       },
     ],
   }

为什么当我使用方法 variants() 时,我得到了空的 HasMany 对象,但是当我只使用 variants 属性时,我得到了一个带有正确数据的 Collection

variants 的属性是如何出现的?我的Product 类中没有定义它。

【问题讨论】:

    标签: php laravel oop eloquent relational-database


    【解决方案1】:

    看看docs。它解释了如何将 Eloquent 的关系用于此特定目的。它解释了更多关于给定here的动态属性

    这旨在完美地查询关系,同时还能够快速接收它们。

    正如你自己所说:

    • variants() 返回 hasMany 关系,这只是对查询 Builder 的补充。当您想进一步查询此关系时,您可以使用它: Product::find(1)->variants()->where('quantity', '>', 0)->get()
    • variants 返回Collection 实例,就像你已经完成variants()->get() 一样,除了你可以继续从Product Model 访问这个Collection,它不会从数据库中重新调用它们。对此进行查询时,您将查询Collection,而不是查询Builder

    【讨论】:

      【解决方案2】:

      这是因为variant 是一个动态属性。您可以通过这种方式获得类似(简化)的结果:

      class Model
      {
          public function dynamicProperty()
          {
              return 'dynamic value';
          }
      
          public function __get(string $property)
          {
              if ($property === 'dynamicProperty') {
                  return $this->dynamicProperty();
              }
          }
      }
      

      当然,laravel 在底层做了很多事情,但 variant 很像 variants()->get()HasOne/HasMany/BelongsTo 主要是 Builder 的包装器。

      【讨论】:

        猜你喜欢
        • 2021-11-06
        • 2021-06-03
        • 2014-12-22
        • 1970-01-01
        • 2021-06-30
        • 1970-01-01
        • 2018-01-17
        • 1970-01-01
        • 2017-10-10
        相关资源
        最近更新 更多