【问题标题】:Can I cast one Eloquent model to another?我可以将一个 Eloquent 模型转换为另一个模型吗?
【发布时间】:2020-07-26 23:57:29
【问题描述】:

在 eloquent 中,您可以在同一张表上运行不同的模型。 那么,是否可以在运行时将对象从一个模型切换到另一个模型。 假设我们有三个类:

Product extends Model
ProductSet extends Product
SimpleProduct extends Product

ProductSet 和 SimpleProduct 之间的区别在于列 complex 对于 ProductSet,列中包含“true”,对于 SimpleProduct,列中包含“false”。

ProductSet 和 SimpleProduct 模型应用了范围,因此ProductSet::all() 将仅获得集合,SimpleProduct::all() 将仅获得简单产品。

然而,父模型允许我们通过Product::all() 获得这两种类型的产品 那么,是否可以遍历 Product 类的所有实例并在运行时根据属性 complex 的值将它们切换到更高级别的模型?

【问题讨论】:

  • 对不起,我不能完全理解,也许我需要知道你的完整型号
  • 我的回答对你有帮助吗?

标签: php laravel oop eloquent


【解决方案1】:

因为您已经扩展了与父级拥有相同 props 的类。您可以遍历任何product 集合并通过getAttributes() 方法获取所有属性并传递给父级。因为您的每个模型都在扩展 Eloquent Model,它接受 constructor 中的属性并填充其属性。

以下示例扩展了默认的 User 类并转换回 Parent

<?php

namespace App;

class Admin extends User {}

获取所有Admins并将它们转换为User

$admins = \App\Admin::all();

$users = [];
foreach ($admins as $admin) {
    $users[] = new \App\User($admin->getAttributes());
}
dd(collect($users));

【讨论】:

  • 谢谢!我不知何故认为将 id 属性直接传递给构造函数是不可接受的。在tinker中检查过,工作正常。尽管所有字段都应该是可批量分配的,否则您需要手动复制它们。反对票不是来自我
【解决方案2】:

是的,您可以这样做,基于 prop 您必须创建该特定类的对象

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2018-11-26
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    相关资源
    最近更新 更多