我使用的是Laravel作业批处理功能,我有一个仪表板,可以显示批处理的进度(已处理、失败、挂起的作业…等等)。
每个用户都有自己的仪表板,我想根据登录用户显示Batch的进度,但我看不到与批处理表job_batches
的用户模型有任何关系。
是否有可能以某种方式与这些表建立关系?还有其他选择吗?
谢谢
这是可能的,但还有很多困难需要克服。这也可能是一个关于扩展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();
注意事项
小心导入正确的
Batch
和BatchRepository
类。我添加了导入,以确保您包括正确的导入,以及提供程序的以下代码段,使您能够实例化我的自定义批处理存储库。
use App\Repostories\BatchRepository as CustomBatchRepository;
$this->app->bind(CustomBatchRepository::class, function () {
return new CustomBatchRepository(resolve(BatchFactory::class), resolve(Connection::class), 'job_batches');
});
您可以自行承担风险,在为这个问题创建的粗略测试场中看到我的解决方案。用户上存在控制器和关系。不确定其他StackoverFlow项目是否有剩余。
只有当作业在本地执行时,我才修改此选项:
$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批管理门户还没有找到任何坚定的解决方案