PHPackages                             asfop/eloquent - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. asfop/eloquent

ActiveLibrary[Database &amp; ORM](/categories/database)

asfop/eloquent
==============

在一对一关联情况下的数据缓存的一种尝试

v1.0.0(1y ago)021MITPHPPHP &gt;=7.1|&gt;=8.0|&gt;=8.1

Since Jun 20Pushed 9mo ago1 watchersCompare

[ Source](https://github.com/g1012415019/has-one)[ Packagist](https://packagist.org/packages/asfop/eloquent)[ RSS](/packages/asfop-eloquent/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (1)Dependencies (3)Versions (2)Used By (0)

介绍
==

[](#介绍)

eloquent 提供了模型关联关系中的一对一和一对多查询。这两种情况下，查询出的数据可以进行缓存以提高性能 在一对一关联情况下的数据缓存的一种尝试

初衷
==

[](#初衷)

在多表连接查询的时候，我的一般做法，我会先查主表，然后再array\_column条件id去匹配副表信息.

例如， `users` 和 `phones` 两张表，它们通过 `user_id` 进行关联

**表结构**

1. users 表：

字段名类型描述idInteger主键nameString用户名emailString邮箱地址2. phones 表：

字段名类型描述idInteger主键user\_idInteger外键，关联到 users 表的 idphone\_numberString电话号码实现方式

```
use App\Models\User;
use App\Models\Phone;

$userData = User::select('id', 'name', 'email')
                ->get();

// 获取所有用户的 id
$userIds = $userData->pluck('id')->toArray();

// 获取每个用户的电话号码
$phoneData = Phone::whereIn('user_id', $userIds)
                  ->select('user_id', 'phone_number')
                  ->get()
                  ->groupBy('user_id');

// 将电话号码数据合并到用户数据中
foreach ($userData as $user) {
    if ($phoneData->has($user->id)) {
        $user->phones = $phoneData[$user->id]->pluck('phone_number')->toArray();
    } else {
        $user->phones = []; // 如果没有电话号码，则设为空数组或 null，视情况而定
    }
}

// 现在 $userData 中每个 $user 对象都有 phones 属性，包含了该用户的所有电话号码

return $userData;
```

**为了简化上述操作，进行了封装，并且对查询出来的结果使用redis将数据缓存**

使用案例
----

[](#使用案例)

---

1. 获取用户id为10000的信息

```
use App\Models\User;
use App\Models\Phone;

$userEloquent = new UserEloquent();
$users=$userEloquent->getById(10000,['info','phone']);
// 结果
 Array
(
    "info" => Array
    (
        "id" => 10000,
        "name" => "Jane",
        "email" => "jane@example.com"
    ),
    "phone" => Array
    (
        "id" => 1,
        "user_id" => 10000,
        "phone_number" => "13681985439"
    )
)
```

2. 获取用户10000和10001的信息

```
use App\Models\User;
use App\Models\Phone;

$userEloquent = new UserEloquent();
$users=$userEloquent->getByIds([10000,10001],['info','phone']);
// 结果
Array
(
    10000 => Array
    (
        "info" => Array
        (
            "id" => 10000,
            "name" => "Jane",
            "email" => "jane@example.com"
        ),
        "phone" => Array
        (
            "id" => 1,
            "user_id" => 10000,
            "phone_number" => "13681985439"
        )
    ),

    10001 => Array
    (
        "info" => Array
        (
            "id" => 10001,
            "name" => "Jane Doe",
            "email" => "jane.doe@example.com"
        ),
        "phone" => Array
        (
            "id" => 2,
            "user_id" => 10001,
            "phone_number" => "13712345678"
        )
    )
    // 可能还有其他用户的信息，取决于查询到的用户数量
)
```

### 如何实现上述查询

[](#如何实现上述查询)

```
//可能存在bug
composer require asfop/eloquent
```

#### 在Hyperf中使用

[](#在hyperf中使用)

创建`Eloquent` 文件夹 目录结构如下

```
├── User
│   ├── UserDrive.php
│   ├── UserEloquent.php
│   └── Attribute
│       ├── Info.php
│       └── Phone.php
```

- `User` 模型 一对一关联
- `UserDrive.php` 属性名对应的数据查询类
- `UserEloquent.php` 自定义快捷查询的类。可定义查询单个用户名，和多个用户函数名
- `Attribute/Info.php` 基础信息实现类
- `Attribute/Phone.php` Phone信息实现类

UserEloquent.php 解释

```
