Laravel Eloquent 与 keyBy 建立关系

2024-04-16

我有一个Product模型与一个hasMany关系

public function pricing()
    {
        return $this->hasMany('App\ProductPrice', 'prod_id', 'id');
    }

然后我得到了关系

Product::with('pricing')->all();

我怎样才能取回pricing与的关系id作为钥匙。我知道我可以做到Collection with keyBy('id)但它不适用于查询。

我想获得与下面相同的结果,但我想从Product关系。

ProductPrice::keyBy('id')

你必须创建自己的关系:

<?php

namespace App\Helpers\Classes;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class HasManyKeyBy extends HasMany
{
    private $keyBy;

    public function __construct($keyBy, Builder $query, Model $parent, string $foreignKey, string $localKey)
    {
        $this->keyBy = $keyBy;
        parent::__construct($query, $parent, $foreignKey, $localKey);
    }

    public function getResults()
    {
        return parent::getResults()->keyBy($this->keyBy);
    }

    protected function getRelationValue(array $dictionary, $key, $type)
    {
        return parent::getRelationValue($dictionary, $key, $type)->keyBy($this->keyBy);
    }
}

为了简单起见,我还建议您创建一个特征:

<?php

namespace App\Helpers\Traits;

use Illuminate\Database\Eloquent\Relations\HasMany;

trait HasManyKeyBy
{
    /**
     * @param $keyBy
     * @param $related
     * @param null $foreignKey
     * @param null $localKey
     * @return HasMany
     */
    protected function hasManyKeyBy($keyBy, $related, $foreignKey = null, $localKey = null)
    {
        // copied from \Illuminate\Database\Eloquent\Concerns\HasRelationships::hasMany

        $instance = $this->newRelatedInstance($related);
        $foreignKey = $foreignKey ?: $this->getForeignKey();
        $localKey = $localKey ?: $this->getKeyName();

        return new \App\Helpers\Classes\HasManyKeyBy($keyBy, $instance->newQuery(),
            $this, $instance->getTable().'.'.$foreignKey, $localKey);
    }
}

现在,您可以将此特征包含到您的模型中,并使用$this->hasManyKeyBy受保护的方法:

[...]
class Product extends Model
{
    use HasManyKeyBy;

    public function pricing()
    {
        return $this->hasManyKeyBy('id', ProductPrice::class, 'prod_id', 'id');
    }

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

Laravel Eloquent 与 keyBy 建立关系 的相关文章

  • 致命错误:发送表单时未找到“App\Http\Controllers\Input”类

    我正在尝试发送一封包含来自 Laravel 应用程序的表单的电子邮件 当你点击提交时 它会抛出上述错误 致命错误 找不到类 App Http Controllers Input 不知道为什么 因为我没有 也不知道我需要有一个输入控制器 或者
  • 在 Laravel 5.1 中将模型保存到数据库之前执行一些操作

    在 Laravel 5 1 模型中 在将数据写入数据库之前 我该如何做一些事情 例如修改某些数据字段或进行更多验证 关于该问题的文档很难在实际应用中使用 http laravel com docs 5 1 eloquent events h
  • Laravel 5.3 Blade 解码 HTML 特殊字符

    我在数据库中保存了一些 HTML 代码 当我将这些数据发送到刀片时 CSS 无法正常工作 在页面源代码中我发现 我该用什么方法将 lt 转换为 有人可以帮助我吗 更改您的语法 to 这应该够了吧
  • 无法使用php连接到远程数据库

    我在 Windows 中安装了 Xampp 并且正在使用 Laravel 5 3 创建一个应用程序 我正在尝试在本地网络上的另一台服务器上执行查询 但是当我尝试这样做时 MySql 服务器使用以下命令对本地服务器上的用户进行身份验证 use
  • Swagger 中的 Laravel(发布、删除、放置)路由

    我已经更新了 get 方法的代码 如下所示 它可以正常工作 大摇大摆地 任何人都可以向我推荐用于发布 放置 删除的 swagger 代码及其 laravel 路由 控制器代码 正如我在 GET 中提到的 路线 web php Route g
  • Laravel 关注者/关注关系

    我正在尝试在 laravel 中制作一个简单的关注者 关注系统 没什么特别的 只需单击一个按钮即可关注或取消关注 并显示关注者或关注你的人 我的问题是我不知道如何建立模型之间的关系 这些是迁移 用户迁移 Schema create user
  • 社交登录重复帐户冲突

    我正在制作一个新应用程序 除了常规电子邮件 密码注册之外 还需要多个社交注册 但是有一种特殊情况可能会导致数据完整性问题 例子 用户在 Facebook 上注册 但没有收到任何电子邮件回复 我在数据库中创建一个用户 将电子邮件和密码设置为
  • 如何传递数据到 Laravel 中查看?

    我将数据传递到我的刀片视图return View make blog posts 在我的刀片视图中 我正在尝试运行 foreach posts as post 我最终得到一个错误说 posts没有定义 我的问题是如何 posts数组被调用
  • Jwt 令牌是唯一的

    我正在使用 JWT 网络令牌系统 我能够成功生成令牌 我在 Laravel 中创建 JWT 令牌 如下所示 我正在使用以下技术堆栈 拉拉维尔 5 2 http laravel com 框架 JWT 包裹 https github com t
  • 流浪家园慢

    我有一个基于 Laravel Homestead 的 vagrant 服务器 用于在本地测试我的 Laravel 站点 大部分情况下它运行得很好 然而 最近 我遇到了问题 它会停止几分钟 典型 到几个小时 罕见 这种情况每 15 分钟左右就
  • Laravel 5.2 CORS,GET 不适用于预检选项

    可怕的 CORS 错误 跨源请求被阻止 同源策略不允许读取 远程资源位于http localhost mysite api test http localhost mysite api test 原因 CORS 标头 Access Cont
  • VSCode 中的 Laravel 9 + PHP 8.0.8 显示语法错误,意外的 '->' (T_OBJECT_OPERATOR)

    为什么我在 PHP 8 0 8 上新创建的 laravel 9 项目在 Visual Studio Code 中显示错误 VSCode 将其显示为错误 return Limit perMinute 60 gt by request gt u
  • 无法打开“storage/logs/laravel-2019-11-22.log”:无法打开流:权限被拒绝

    在生产服务器上输入我的网站时出现以下错误 无法打开流或文件 var app current storage logs laravel 2019 11 22 log 无法打开流 权限被拒绝 我尝试运行以下命令 但 git 权限在终端中被拒绝
  • laravel 基本查询中“允许的内存大小已耗尽 134217728 字节”

    我不知道为什么我无法让以下工作正常工作 DB table twitter hashtags gt paginate 5 每次我得到 第二个数字往往不同 Allowed memory size of 134217728 bytes exhau
  • AngularJS + Laravel 5 身份验证

    在使用 AngularJS 构建 SPA 时 我想在 AngularJS 网站中实现用户身份验证 但是 我不知道从哪里开始以及最佳实践是什么 基本上我有一个确定可以担任一个或多个角色 我寻找了一些例子 这样我就可以对如何正确处理这个问题有一
  • 如何在 vue.js 中使用 SVG.js 插件?

    我在用svg js在我的 Laravel 项目中运行vue js 这就是我使用的方式svg js Step 1 安装svg js作为我的 vue 应用程序中的插件 import svgJs from svg js dist svg expo
  • /bootstrap/start.php 中的 Laravel 错误:\Illuminate\Foundation\Application 未找到

    因此 我在开发服务器上安装了 Laravel php5 5 3 标准安装 安装了 mcrypt 并收到以下错误消息 Fatal error Class Illuminate Foundation Application not found
  • 在 Laravel 视图中使用 CSS?

    我刚刚开始学习 Laravel 并且可以掌握控制器和路由的基础知识 我的操作系统是 Mac OS X Lion 它位于 MAMP 服务器上 我的routes php代码 Route get function return View make
  • 表单请求中的 Laravel 数组验证

    我无法验证 Form Request 类中包含数组元素的字段 规则方法 public function rules return state gt required state 0 gt required state gt required
  • Laravel 中如何返回数组而不是集合?

    在 Laravel 中 可以仅选择一个字段并将其作为集合 数组返回 例如考虑模型Foo链接到表foos其中有字段id a b c 考虑以下示例数据 1 10 15 20 1 12 15 27 1 17 15 27 1 25 16 29 1

随机推荐