如何导入具有关系 ID 的 excel 文件?
How to import excel file with relationship id?
我尝试使用 Excel 文件导入作业请求的行,但我不知道如何在其中的行中存储作业请求的 ID。
我有 2 个模型
求职
protected $table = "jobs";
protected $fillable=['job_id', 'customer_id', 'note', 'created_by', 'updated_by'];
public function products(){
return $this->hasMany(Product::class);
}
public function users(){
return $this->belongsTo('App\User', 'created_by');
}
public function lines(){
return $this->hasMany(Line::class);
}
行
protected $table = 'lines';
protected $fillable=['job_id', 'product_id', 'user_id', 'reason_id', 'created_by', 'updated_by', 'created_at', 'updated_at' ];
public function users(){
return $this->belongsTo('App\User', 'user_id');
}
public function jobs(){
return $this->belongsTo(Job::class, 'job_id');
}
public function products(){
return $this->belongsTo(Product::class, 'product_id');
}
添加行时,我将打开工作请求并添加行。该行将保存为
product_id 和 job_id.
<form action="{{ route('file-import') }}" method="POST" class="form-default" enctype="multipart/form-data">
@csrf
<div class="col-lg-12">
<div class="card">
<!--div class="card-header">
<h4 class="card-title">Upload Excel File</h4>
</div--><!--end card-header-->
<div class="card-body">
<div class="mt-3">
<div class="col-lg-12 mb-2 mb-lg-0">
<label class="form-label" for="pro-end-date">Products</label>
<label for="file">File:</label>
<input id="file" type="file" name="file" class="form-control">
<input type="hidden" name="job_id" value="{{ $jobs->id }}" />
</div><!--end col-->
</div>
</div> <!-- end card-body -->
</div> <!-- end card -->
</div> <!-- end col -->
<div class="modal-footer">
<button type="submit" class="btn btn-soft-primary btn-sm">Save</button>
<button type="button" class="btn btn-soft-secondary btn-sm" data-bs-dismiss="modal">Cancel</button>
</div><!--end modal-footer-->
</form>
这是LineController
public function fileImport(Request $request)
{
$file = $request->file;
Excel::import(new LineImport, $file);
return back();
}
这是 LineImport 模型
public function model(array $row)
{
$job = Job::find(1);
return new Line([
'product_id' => $row['product_id'],
'reason_id' => $row['reason_id'],
'updated_by' => Auth::id(),
'job_id' => $job->id,
]);
}
我不知道如何存储job_id(这个job_id是我在上传Excel之前打开的记录文件)。
与 Excel 文件中的 product_id。
到行。
这就是我需要解决方案的问题。
提前谢谢你。期待您的回复。
我对你的措辞有点困惑,但我认为这就是你的意思?
您有一个 CustomJob 模型(我们称它为避免与 Laravel 'jobs' 混淆),它对应于数据库中的 custom_jobs table,其中'id'、'customer_id'、'note'、'created_by'、'updated_by' 列。 (我不确定为什么你有一个 'id' 字段,大概还有一个 'job_id' 字段,所以后者可能不相关)
每个 CustomJob 都有一个或多个 Line,它与一个 CustomJob(通过 lines.custom_job_id = custom_jobs.id)、一个 User(通过 lines.user_id = users.id)关联和一个产品(通过 lines.product_id = products.id)。
看来您还需要与 Reasons 关联(通过 lines.reason_id = reasons.id)。
用户在网站前端提交上传表单,其中包含一个文件,以及一个custom_job_id。在您的 LineController 中,您使用的是 Maatweb/Excel,从外观上看,您将文件传递给它,这基本上拆分了行。你希望它返回一个新的 Line() 但你不能,因为 Line() 需要一个 custom_job_id 而你没有给它?
如果是这样,那么 (a) 您需要从提交的表单中获取 custom_job_id,并且 (b) 将其传递给导入以便它可以使用它:
从提交的表单中获取custom_job_id
这很简单:
$file = $request->file;
$custom_job_id = $request->job_id;
将custom_job_id传递给导入
首先您需要编辑您的 LineController 以发送 custom_job_id :
Excel::import(new LineImport($custom_job_id), $file);
然后您需要向 LineImport 添加一个构造函数,以便它知道期待一个 custom_job_id 进来:
public function __construct(string $custom_job_id)) {
$this->custom_job_id= $custom_job_id;
}
然后您可以在填充线时在您的模型中访问它
public function model(array $row)
{
return new Line([
'product_id' => $row['product_id'],
'reason_id' => $row['reason_id'],
'updated_by' => Auth::id(),
'custom_job_id' => $this->custom_job_id,
]);
}
我尝试使用 Excel 文件导入作业请求的行,但我不知道如何在其中的行中存储作业请求的 ID。
我有 2 个模型
求职
protected $table = "jobs";
protected $fillable=['job_id', 'customer_id', 'note', 'created_by', 'updated_by'];
public function products(){
return $this->hasMany(Product::class);
}
public function users(){
return $this->belongsTo('App\User', 'created_by');
}
public function lines(){
return $this->hasMany(Line::class);
}
行
protected $table = 'lines';
protected $fillable=['job_id', 'product_id', 'user_id', 'reason_id', 'created_by', 'updated_by', 'created_at', 'updated_at' ];
public function users(){
return $this->belongsTo('App\User', 'user_id');
}
public function jobs(){
return $this->belongsTo(Job::class, 'job_id');
}
public function products(){
return $this->belongsTo(Product::class, 'product_id');
}
添加行时,我将打开工作请求并添加行。该行将保存为 product_id 和 job_id.
<form action="{{ route('file-import') }}" method="POST" class="form-default" enctype="multipart/form-data">
@csrf
<div class="col-lg-12">
<div class="card">
<!--div class="card-header">
<h4 class="card-title">Upload Excel File</h4>
</div--><!--end card-header-->
<div class="card-body">
<div class="mt-3">
<div class="col-lg-12 mb-2 mb-lg-0">
<label class="form-label" for="pro-end-date">Products</label>
<label for="file">File:</label>
<input id="file" type="file" name="file" class="form-control">
<input type="hidden" name="job_id" value="{{ $jobs->id }}" />
</div><!--end col-->
</div>
</div> <!-- end card-body -->
</div> <!-- end card -->
</div> <!-- end col -->
<div class="modal-footer">
<button type="submit" class="btn btn-soft-primary btn-sm">Save</button>
<button type="button" class="btn btn-soft-secondary btn-sm" data-bs-dismiss="modal">Cancel</button>
</div><!--end modal-footer-->
</form>
这是LineController
public function fileImport(Request $request)
{
$file = $request->file;
Excel::import(new LineImport, $file);
return back();
}
这是 LineImport 模型
public function model(array $row)
{
$job = Job::find(1);
return new Line([
'product_id' => $row['product_id'],
'reason_id' => $row['reason_id'],
'updated_by' => Auth::id(),
'job_id' => $job->id,
]);
}
我不知道如何存储job_id(这个job_id是我在上传Excel之前打开的记录文件)。
与 Excel 文件中的 product_id。
到行。
这就是我需要解决方案的问题。
提前谢谢你。期待您的回复。
我对你的措辞有点困惑,但我认为这就是你的意思?
您有一个 CustomJob 模型(我们称它为避免与 Laravel 'jobs' 混淆),它对应于数据库中的 custom_jobs table,其中'id'、'customer_id'、'note'、'created_by'、'updated_by' 列。 (我不确定为什么你有一个 'id' 字段,大概还有一个 'job_id' 字段,所以后者可能不相关)
每个 CustomJob 都有一个或多个 Line,它与一个 CustomJob(通过 lines.custom_job_id = custom_jobs.id)、一个 User(通过 lines.user_id = users.id)关联和一个产品(通过 lines.product_id = products.id)。
看来您还需要与 Reasons 关联(通过 lines.reason_id = reasons.id)。
用户在网站前端提交上传表单,其中包含一个文件,以及一个custom_job_id。在您的 LineController 中,您使用的是 Maatweb/Excel,从外观上看,您将文件传递给它,这基本上拆分了行。你希望它返回一个新的 Line() 但你不能,因为 Line() 需要一个 custom_job_id 而你没有给它?
如果是这样,那么 (a) 您需要从提交的表单中获取 custom_job_id,并且 (b) 将其传递给导入以便它可以使用它:
从提交的表单中获取custom_job_id
这很简单:
$file = $request->file;
$custom_job_id = $request->job_id;
将custom_job_id传递给导入
首先您需要编辑您的 LineController 以发送 custom_job_id :
Excel::import(new LineImport($custom_job_id), $file);
然后您需要向 LineImport 添加一个构造函数,以便它知道期待一个 custom_job_id 进来:
public function __construct(string $custom_job_id)) {
$this->custom_job_id= $custom_job_id;
}
然后您可以在填充线时在您的模型中访问它
public function model(array $row)
{
return new Line([
'product_id' => $row['product_id'],
'reason_id' => $row['reason_id'],
'updated_by' => Auth::id(),
'custom_job_id' => $this->custom_job_id,
]);
}