当前位置: 首页 > 知识库问答 >
问题:

Laravel作业批处理表与用户模型的关系?

太叔鸿
2023-03-14

我使用的是Laravel作业批处理功能,我有一个仪表板,可以显示批处理的进度(已处理、失败、挂起的作业…等等)。

每个用户都有自己的仪表板,我想根据登录用户显示Batch的进度,但我看不到与批处理表job_batches的用户模型有任何关系。

是否有可能以某种方式与这些表建立关系?还有其他选择吗?

谢谢

共有2个答案

锺离马鲁
2023-03-14

这是可能的,但还有很多困难需要克服。这也可能是一个关于扩展Laravel功能的通用方法的问题。

一些快速的假设是,您在创建批处理时使用某种身份验证,因此您可以执行Auth::user()-

使用迁移为job\u batches表创建user\u id

    Schema::table('job_batches', function (Blueprint $table) {
        $table->unsignedBigInteger('user_id')->after('name')->nullable();
        $table->foreign('user_id')->references('id')->on('users');
    });

Laravel使用批存储库在job\u Batches表中创建批,对其进行扩展并添加逻辑以将用户插入行中。我已将自定义存储库添加到App\Repositories名称空间。通常使用当前逻辑,并在执行核心Laravel逻辑后更新用户id。

<?php

namespace App\Repostories;

use Illuminate\Bus\DatabaseBatchRepository;
use Illuminate\Bus\PendingBatch;
use Illuminate\Support\Facades\Auth;

class BatchRepository extends DatabaseBatchRepository
{
    public function store(PendingBatch $batch)
    {
        $batch = parent::store($batch); // TODO: Change the autogenerated stub

        $this->connection->table($this->table)
            ->where('id', $batch->id)->update([
                'user_id' => Auth::user()->id,
            ]);

        return $batch;
    }
}

要使用新的类,需要扩展容器中的当前类。第三个参数是表名,假设您使用的是默认表。这是在提供程序中完成的。要么把它放在现有的提供程序中,要么创建一个新的提供程序,记得注册它。

use Illuminate\Bus\BatchFactory;
use Illuminate\Bus\BatchRepository;
use Illuminate\Database\Connection;
use App\Repostories\BatchRepository as CustomBatchRepository;

...

public function register()
{
    $this->app->extend(BatchRepository::class, function () {
        return new CustomBatchRepository(resolve(BatchFactory::class), resolve(Connection::class), 'job_batches');
    });
}

使用以下代码段进行测试,这将向表行添加用户id。

Bus::batch([new TestJob(), new TestJob()])->dispatch();

这种关系

BatchRepository返回不是雄辩模型的Batch。因此,我建议为关系目的创建您自己的雄辩模型,并在您想要拥有批处理功能时将其转换为批处理功能(例如。

首先,为您的批处理建立雄辩的模型。php。同时还要准备toBatch()功能,将雄辩的模型转换为批处理类。

namespace App;

use Illuminate\Bus\BatchRepository;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Batch extends Model
{
    use HasFactory;

    protected $table = 'job_batches';

    public function toBatch()
    {
        return resolve(BatchRepository::class)->toBatch($this);
    }
}

用户上创建关系方法。php

public function batches()
{
    return $this->hasMany(Batch::class);
}

我用下面的代码片段测试了关系设置,它很有效。

User::first()->batches->first()->toBatch();

其次,假设有多个批处理,您将能够轻松获得具有高阶函数的批处理类。或者把它们作为一种适当的关系。

User::first()->batches->map->toBatch();

注意事项

小心导入正确的BatchBatchRepository类。我添加了导入,以确保您包括正确的导入,以及提供程序的以下代码段,使您能够实例化我的自定义批处理存储库。

use App\Repostories\BatchRepository as CustomBatchRepository;

$this->app->bind(CustomBatchRepository::class, function () {
    return new CustomBatchRepository(resolve(BatchFactory::class), resolve(Connection::class), 'job_batches');
});

您可以自行承担风险,在为这个问题创建的粗略测试场中看到我的解决方案。用户上存在控制器和关系。不确定其他StackoverFlow项目是否有剩余。

韩智明
2023-03-14

只有当作业在本地执行时,我才修改此选项:

$this->connection->table($this->table)
        ->where('id', $batch->id)->update([
            'user_id' => Auth::user()->id ?? null,
        ]);
 类似资料:
  • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。

  • 我想从文本文件中读取、解析和写入数据。我实现了这一点,但我有一个关于标识符声明的问题。我在下面展示了我的类。 客户数据apper.java 顾客JAVA 文件管理器。xml 我想问这个问题,我可以在FieldSetMapper中使用下面的类吗?如果我在定义标识符时不使用Camelcase符号,那么写入数据库就不起作用了。有什么方法或方法吗?非常感谢。 顾客JAVA

  • 我正在学习拉威尔,有一件事我无法解决。 我有什么: 用户、帖子、评论及相应模型表 使用者php:

  • 目前,我有在Spring批处理2.1中开发的Spring批处理作业 由于有这么多作业,而且它们在很长一段时间内运行良好,因此升级到最新版本需要一些时间。 到目前为止,我想建立Spring批管理门户还没有找到任何坚定的解决方案