muzidudu/laravel-record

为 Laravel 应用程序提供用户记录功能。

dev-main 2022-10-04 15:47 UTC

This package is auto-updated.

Last update: 2024-09-04 19:48:43 UTC


README

❤️ 为 Laravel 应用程序提供用户记录功能。

CI Latest Stable Version Latest Unstable Version Total Downloads License

Sponsor me

安装

composer require muzidudu/laravel-record -vvv

配置和迁移

php artisan vendor:publish

用法

特质

Muzidudu\LaravelRecord\Traits\Recorder

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Muzidudu\LaravelRecord\Traits\Recorder;

class User extends Authenticatable
{
    use Recorder;

    <...>
}

Muzidudu\LaravelRecord\Traits\Recordable

use Illuminate\Database\Eloquent\Model;
use Muzidudu\LaravelRecord\Traits\Recordable;

class Post extends Model
{
    use Recordable;

    <...>
}

API

$user = User::find(1);
$post = Post::find(2);

$user->record($post);
$user->unrecord($post);
$user->toggleRecord($post);
$user->getRecordItems(Post::class)

$user->hasRecorded($post);
$post->hasBeenRecordedBy($user);

获取对象记录器

foreach($post->recorders as $user) {
    // echo $user->name;
}

从用户获取记录模型。

使用具有记录特质的模型可以轻松获取可记录模型来完成您想要的功能。_注意:此方法将返回一个 Illuminate\Database\Eloquent\Builder_

$user->getRecordItems(Post::class);

// Do more
$favortePosts = $user->getRecordItems(Post::class)->get();
$favortePosts = $user->getRecordItems(Post::class)->paginate();
$favortePosts = $user->getRecordItems(Post::class)->where('title', 'Laravel-Record')->get();

聚合

// all
$user->records()->count();

// with type
$user->records()->withType(Post::class)->count();

// recorders count
$post->recorders()->count();

使用 *_count 属性进行列表

$users = User::withCount('records')->get();

foreach($users as $user) {
    echo $user->records_count;
}


// for Recordable models:
$posts = Post::withCount('recorders')->get();

foreach($posts as $post) {
    echo $post->records_count;
}

将用户记录状态附加到可记录集合中

您可以使用 Recorder::attachRecordStatus($recordables) 来附加用户记录状态,它将为 $recordables 中的每个模型设置 has_recorded 属性

对于模型

$post = Post::find(1);

$post = $user->attachRecordStatus($post);

// result
[
    "id" => 1
    "title" => "Add socialite login support."
    "created_at" => "2021-05-20T03:26:16.000000Z"
    "updated_at" => "2021-05-20T03:26:16.000000Z"
    "has_recorded" => true
 ],

对于 Collection | Paginator | LengthAwarePaginator | array

$posts = Post::oldest('id')->get();

$posts = $user->attachRecordStatus($posts);

$posts = $posts->toArray();

// result
[
  [
    "id" => 1
    "title" => "Post title1"
    "created_at" => "2021-05-20T03:26:16.000000Z"
    "updated_at" => "2021-05-20T03:26:16.000000Z"
    "has_recorded" => true
  ],
  [
    "id" => 2
    "title" => "Post title2"
    "created_at" => "2021-05-20T03:26:16.000000Z"
    "updated_at" => "2021-05-20T03:26:16.000000Z"
    "has_recorded" => false
  ],
  [
    "id" => 3
    "title" => "Post title3"
    "created_at" => "2021-05-20T03:26:16.000000Z"
    "updated_at" => "2021-05-20T03:26:16.000000Z"
    "has_recorded" => true
  ],
]

对于分页

$posts = Post::paginate(20);

$user->attachRecordStatus($posts);

N+1 问题

为了避免 N+1 问题,您可以使用预加载来将此操作减少到仅两个查询。在查询时,您可以使用 with 方法指定应预加载哪些关系

// Recorder
$users = User::with('records')->get();

foreach($users as $user) {
    $user->hasRecorded($post);
}

// Recordable
$posts = Post::with('records')->get();
// or
$posts = Post::with('recorders')->get();

foreach($posts as $post) {
    $post->isRecordedBy($user);
}

事件

相关包

贡献

您可以通过以下三种方式之一进行贡献

  1. 使用 问题跟踪器 提交错误报告。
  2. 问题跟踪器 上回答问题或修复错误。
  3. 贡献新功能或更新 wiki。

代码贡献过程并不非常正式。您只需确保遵循 PSR-0、PSR-1 和 PSR-2 编码指南。任何新的代码贡献都必须附有适用的单元测试。

❤️ 赞助我

Sponsor me

如果您喜欢我的项目并想支持它,点击这里 ❤️

项目由 JetBrains 支持

非常感谢 JetBrains 慷慨地提供许可证,让我可以在此和其他开源项目上工作。

PHP 扩展包开发

想知道如何从零开始构建 PHP 扩展包?

请关注我的实战课程,我将在该课程中分享一些扩展开发经验 —— 《PHP 扩展包实战教程 - 从入门到发布》

许可协议

MIT