Laravel 模型动态属性

2024-04-11

我想问如何在模型类上创建动态属性。假设我有一个如下代码所示的表结构。

Schema::create('materials', function (Blueprint $table) {
    $table->increments('id');
    $table->string('sp_number');
    $table->string('factory');
    $table->text('dynamic_fields')->comment('All description of the material will saved as json');
    $table->timestamps();
});

我的表结构中有一个名为“dynamic_fields”的列,它将保存字段的 JSON 字符串。下面是 JSON 结构的示例。

[  
   {  
      "name":"COLOR WAY",
      "value":"ASDFF12"
   },
   {  
      "name":"DESCRIPTION",
      "value":"agg2sd12"
   },
   {  
      "name":"REF NUM",
      "value":"121312"
   }
]

我想从动态字段访问字段,例如“COLOR WAY”。

在我的模型中,我想像这样访问动态字段上的“COLOR WAY”字段

$material->color_way;

有人能告诉我该怎么做吗?


如果您提前知道只会存在某些动态字段,则可以选择为它们创建访问器方法。例如,您可以将其添加到您的模型中:

// Dynamic fields must be cast as an array to iterate through them as shown below
protected $casts = [
    'dynamic_fields' => 'array'
];

// ...

public function getColorWayAttribute()
{
    foreach ($this->dynamic_fields as $field) {
        if ($field['name'] === 'COLOR WAY') {
            return $field['value'];
        }
    }

    return null;
}

这将允许您执行以下操作:

$colorWay = $material->color_way;

或者,如果您的组合dynamic_fields不受限制,可能有大量,或者您希望有更大的灵活性以便能够添加更多并让它们可访问,您可以覆盖getAttributeLaravel 模型类的方法。

// Dynamic fields must be cast as an array to iterate through them as shown below
protected $casts = [
    'dynamic_fields' => 'array'
];

// ...

public function getAttribute($key)
{
    $attribute = parent::getAttribute($key);

    if ($attribute === null && array_key_exists('dynamic_fields', $this->attributes)) {
        foreach ($this->dynamic_fields as $dynamicField) {
            $name = $dynamicField['name'];
            if (str_replace(' ', '_', mb_strtolower($name)) === $key) {
                return $dynamicField['value'];
            }
        }
    }

    return $attribute;
}

这种方法调用 Laravel 的实现getAttribute它首先检查您是否定义了实际的属性,或者是否为该属性定义了访问器(就像我的第一个建议一样),然后检查基模型类上是否存在具有该名称的方法,最后尝试加载关系(如果您已定义)。

当这些方法中的每一种都失败时(null返回),然后我们检查是否有dynamic_fields模型中的属性。如果有,我们循环遍历每个动态字段(假设您的dynamic_fields被投射为array),然后我们将定义的动态字段的名称转换为小写,并用下划线替换空格。然后,我们最后检查刚刚派生的名称是否与提供的键匹配,如果匹配,我们返回该值。如果没有的话,原来的$attribute将被返回,这将是null.

这将允许您获取任何动态字段,就像它们被定义为类中的属性一样。

$colorWay = $material->color_way;
$description = $material->description;
$refNum = $material->ref_num;

请注意:我还没有测试过这段代码,很可能存在一两个问题。尝试一下,看看它是否适合您。另请注意,这仅适用于获取动态字段,设置它们将需要重写另一个方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel 模型动态属性 的相关文章

  • MySQL GROUP 通过还是使用 PHP?

    我有一个看起来很简单的问题 但我只是想问你如何解决它 在 MySQL 表中有以下结构 provider artist a 1 a 2 a 3 b 4 现在需要在 HTML 中回显一个列表 例如 provider a 1 2 3 provid
  • 使用 GMail 和 phpMailer 发送时出现“服务器未接受密码:535 身份验证数据不正确”

    我在本地主机上运行相同的 php 脚本 我的带有 XAMPP 的 PC 和托管服务器上 它可以在我的电脑上运行 但不能在托管服务器上运行 当我从托管服务器发送它时 我得到以下输出 SMTP gt ERROR Password not acc
  • 从(本地)python 脚本运行(远程)php 脚本

    如何让 python 本地 运行 php 脚本在远程服务器上 我不想用 python 脚本或任何东西处理它的输出 只需执行它并同时退出 python 而 php 脚本已经在工作并完成其工作 编辑 我想要实现的目标 python脚本连接ftp
  • laravel 基本查询中“允许的内存大小已耗尽 134217728 字节”

    我不知道为什么我无法让以下工作正常工作 DB table twitter hashtags gt paginate 5 每次我得到 第二个数字往往不同 Allowed memory size of 134217728 bytes exhau
  • 如何从symfony2中的表单对象获取每个字段的错误消息?

    我按照这个教程http symfony com doc current forms html http symfony com doc current forms html我完美地呈现了我的插入表单 但只有一个问题我无法解决 当表单无效时
  • Laravel - 雄辩地覆盖自定义时间戳......为什么?

    我正在制作一个库存管理系统 当产品缺货时 我会在表中输入一个条目 并记下 oos at 字段和日期 时间 后来 当它回到库存时 我找到该条目并更新 restocked at 时间戳字段 但是 当我执行第二个操作时 我的 oos at 字段被
  • 如何将现场 prestashop 站点移至本地主机?

    我在将 PS 1 7 从服务器域传输到本地主机时遇到问题 我已按照 Prestashop 文档中的文件传输的所有步骤进行操作 我执行此步骤 1 将所有 prestashop 文件从服务器下载到我的 mac 并将其放入 mamp htdocs
  • php:不知从何而来的空行

    我有奇怪的错误 不知道如何解决它而不浪费太多时间 我的控制器中有一个方法 应该使用以下方法返回 xml header Content type text xml header Content Disposition attachment f
  • 在 PHP 中生成 Excel 输出的最佳方法是什么? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 还有其他类似 PHPExcel 的 PHP 组件吗 有一些类可以生成 PHP Excel 文件 真正的 Excel 文件 而不是 csv
  • 正则表达式 - PHP Lookaround

    我有一个字符串 例如 foo Hello How are you I am very good thank you 我知道这是一个奇怪的字符串 但请留在我身边 P 我需要一个正则表达式来查找 在此处查找内容 之间的内容 并将其放入数组中 即
  • PHP 发生致命错误,行号不存在

    致命错误 允许的内存大小 134217728 字节已耗尽 尝试分配 523800 字节 Library WebServer Documents XMLDataStore class php在线的981 这个错误的奇怪之处不是内存泄漏 这很容
  • 复制具有所有关系的 Doctrine 对象

    我想复印一份他所有亲戚的记录 我正在尝试 o Doctrine getTable Table gt Find x copy object gt copy relations o gt getRelations foreach relatio
  • 每行仅显示 3 个 foreach 结果

    我的脚本如下 output table class products tr while info mysql fetch array data Outputs the image and other data output td img s
  • Laravel 社交名流 $user->getId()?

    我不确定这是否是真正导致我的问题的原因 但也许有人会知道 当我使用 Laravel Socialite 并执行以下操作时 social user Socialite driver provider gt user 然后我的代码中的其他地方执
  • mysql 密码 使用 PHP 连接到 MySQL

    在使用 PHP 连接到 MySQL 的教程中 您会看到类似于以下内容的内容 pdo new PDO mysql host localhost dbname mydb myuser mypassword 我在本地主机上有一个以这种方式工作的连
  • WAMP/MySQL 错误语言不正确

    我已经多次重新安装WAMP 搜索了数百页 但仍未解决此问题 我查看了 phpmyadmin 配置文件 设置 cfg Lang en utf 8 卸载了多次 如上所述 似乎没有运气 任何帮助 将不胜感激 要更改 MySQL 在报告时使用的语言
  • json_encode() 非 utf-8 字符串?

    所以我有一个字符串数组 并且所有字符串都使用系统默认值ANSI编码并从 SQL 数据库中提取 因此有 256 种不同的可能的字符字节值 单字节编码 有什么方法可以让我得到json encode 工作并显示这些字符而不必使用utf8 enco
  • 在php中如何设置数组的大小?

    我只想在 php 中设置数组的大小 而不必用任何值填充它 我怎么做 Use 固定阵列 http php net SplFixedArray对于固定大小的数组 array new SplFixedArray 3 array 0 1 array
  • 启用 Chrome Headless 时 Dusk 测试失败

    我有一个 HTML 元素 该元素应该仅在第一页加载时显示 Javascript 设置 cookie 如果设置了 cookie 则不会显示该元素 PHP 检查 cookie 如果 cookie 存在 则不会呈现内容 我正在尝试为此进行 lar
  • 使用 WordPress 中的钩子在帖子更新(自定义帖子类型)后获取更新值

    我想获得更新后操作的最新更新值 我已经使用了 save post post updated publish post挂钩但全部返回旧值 但我同时需要当前更新值 我试过下面的代码 add action post updated wpse634

随机推荐

  • 如何使用react.js上传Excel工作表文件并将数据显示到表格

    我是 React JS 的新手 我正在尝试使用react js上传Excel工作表文件并将数据显示到表格中 我有 链接中的部分参考 但并不完整 请帮忙解决一下 从 Excel 导入数据并在 React 组件中显示 https stackov
  • MVC 3 应用程序中的自定义 Http 处理程序

    我正在使用 Http 处理程序来本地化应用程序中使用的 javascript 文件 看 在 ASP NET 中本地化 JavaScript 文件中的文本 http madskristensen net post Localize text
  • Gulp - 处理多个主题和文件夹

    我正在努力创造一个终极gulpfile我们可以在我们的大型网站之一上使用它 一个具有多个主题 具体取决于您所在网站的部分 我试图让它只运行它需要运行的进程 而不是重新编译所有内容 让我准确地布局我想要实现的目标 文件夹结构 src mast
  • C# 反射:获取解决方案中的“所有”活动程序集?

    这是我的问题 我有 2 个项目 一个 常见 项目 其行为类似于具有各种支持代码的库 以及在许多调用中使用所述项目的实际程序 我们将这些项目称为 Common 和 Program 它们都在同一个解决方案中 在 Common 中 我有一个用于常
  • 使用我自己的 Laravel API 时如何遵循“不重复”原则?

    我正在开发一个 Laravel 4 应用程序 它将通过 JSON REST API 和 Web UI 对我的数据集提供相同的 CRUD 操作 看来 为了防止违反 DRY 原则 我的 UI 应该通过将所有请求从 UI 路由回 API 来使用我
  • 将 Rails/Unicorn/Nginx 容器连接到 MySQL 容器

    相关this https stackoverflow com questions 31735529 docker image from existing rails unicorn mysql app线程 我正在尝试创建 2 个容器 1 个
  • Service Fabric:找不到 EntryPoint Blah.exe

    我进行了一些项目重命名并更改了文件夹结构 现在我无法将服务结构应用程序部署到本地服务结构集群 Register ServiceFabricApplicationType 找不到 EntryPoint IdentityService exe
  • Selenium 代码不会终止

    以下代码不会终止 原因可能是什么 from selenium import webdriver from selenium webdriver common keys import Keys driver webdriver Firefox
  • Mod_Rewrite 规则冲突让我发疯

    我有一个 htaccess 如下 有些规则是冲突的 我需要以某种方式制定一个条件 这样他们就不会 RewriteEngine On RewriteRule search results template php L RewriteRule
  • 使用 Composer 安装 PEAR 扩展 HTTP_Request2

    我有一个composer json file name vendor Project description description text repositories type pear url http pear php net req
  • 在 gstreamer 中动态添加和删除 tee 队列

    我编写了gstreamer代码 用于同时进行摄像头直播和录制 我的管道看起来像这样 queue1 videosink v4l2src tee queue2 filesink 目前直播和文件录制正在协同工作 现在我需要启动只有一个队列的管道
  • 设置 NSWindow 焦点

    我有一个带有一个窗口和一个面板的应用程序 附加到该窗口 steps 停用我的应用程序 应用程序已打开 但没有焦点 单击面板上的按钮 面板现在处于焦点状态 但主窗口不是 如何从面板将焦点设置到主窗口 父窗口 Swift 5 版本的 BUDAx
  • 在自定义插件类中使用 Carbon Fields

    我有一个到目前为止还没有任何功能的插件 这是当前的结构
  • 木槌的基本用法。第一步

    我正在尝试使用Mallet实际上没有主题建模等方面的经验 我的目的是获得N的主题M我现在拥有的文档 用一个或多个主题对每个文档进行分类 文档 1 主题 1 文档 2 主题 2 可能还有主题 3 并用此结果对将来的新文档进行分类 我尝试使用b
  • 使用 Angular ui-router 有条件地导航到状态

    目前 我们有一个测试版的 投资组合 工具 用户登录主应用程序后 如果他们已获得测试版的访问权限 他们可以直接导航到投资组合工具 无需任何额外的登录 如果没有 他们应该被重定向到投资组合登录页面 状态称为portfolio login 他们可
  • 在我的服务器上运行其他人代码(沙箱)的安全方法?

    我想制作一个在本地运行其他人的代码的网络服务 当然 我想限制他们的代码对某个 沙箱 目录的访问 这样他们就无法连接到我服务器的其他部分 数据库 主网络服务器等 最好的方法是什么 运行VMware Virtualbox 我猜它已经尽可能安全了
  • 如何检查 Tensorflow LinearClassifier 的特征权重?

    我正在尝试理解使用 TensorFlow 的大规模线性模型 https www tensorflow org tutorials linear文档 这些文档对这些模型的推动如下 线性模型比神经模型更容易解释和调试 网 您可以检查分配给每个特
  • HTTP Cookie 的替代方案?

    他们说 Cookie 是bad http cafe elharo com web why cookies are bad for you 3 我个人认为应该有一种 更智能 的方法来检测网络应用程序上用户的状态 比如说 目前这就是它在分布式环
  • 在 ASP.NET MVC 和 WPF MVVM 中重用相同的模型

    我正在 WPF MVVM 中开发一个应用程序 但我还需要在同一解决方案中创建一个 MVC 项目 我想知道是否有任何方法可以在两个类中重用相同的模型 以及最好的方法 因为满足 MVVM 规范 例如 我需要将 PropertyChanged 添
  • Laravel 模型动态属性

    我想问如何在模型类上创建动态属性 假设我有一个如下代码所示的表结构 Schema create materials function Blueprint table table gt increments id table gt strin