我有一个包含主键 id 的发票表和包含外键发票_id 的发票详细信息表。
在发票上保存主键时,如何同时将主键保存在发票详细信息的外键上?
public function store(Request $request)
{
$validation = $request->validate([
'user' => 'required',
'company' => 'required',
'invoice_month' => 'required',
]);
Invoice::create($validation);
$title = $request->title;
$quantity = $request->quantity;
$unit_price = $request->unit_price;
$sort_order = $request->sort_order;
$now = Carbon::now();
for($i=0; $i < count($title); $i++){
$datasave = [
'sort_order' => $sort_order[$i],
'title' => $title[$i],
'quantity' => $quantity[$i],
'unit_price' => $unit_price[$i],
'created' => $now,
'modified' => $now,
];
DB::table('invoice_details')->insert($datasave);
}
return redirect('invoice')->with('flash_message', 'Saved');
}
型号:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Invoice_detail extends Model
{
use HasFactory;
protected $table = 'invoice_details';
protected $primaryKey = 'id';
protected $fillable = ['title', 'quantity', 'unit_price'];
public function invoice(){
return $this->belongsTo(\App\Invoice::class, 'invoice_id');
}
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Invoice extends Model
{
use HasFactory;
protected $table = 'invoices';
protected $primaryKey = 'id';
protected $fillable = ['user', 'company', 'invoice_month'];
const UPDATED_AT = 'modified';
const CREATED_AT = 'created';
public function invoice_detail(){
return $this->hasOne(\App\Invoice_detail::class);
}
}
路线:
Route::get('/home', function(){
return view('homepage');
});
//Route::resource('invoice', InvoiceController::class);
Route::get('invoice', [InvoiceController::class, 'index']);
Route::get('search', [InvoiceController::class, 'search']);
Route::resource('/invoic', InvoiceController::class);
您可以拥有许多发票详细信息,并且您已经编写了一种关系,并且您正在保存许多记录。
另一方面,您可以使用关系来保存相关数据,也可以手动完成。
首先在发票模型中更改您的关系。
public function invoice_detail(){
return $this->hasMany(Invoice_detail::class, 'invoice_id');
}
然后在 Invoice_detail 中也在可填写数组中提供发票_id。
protected $fillable = ['title', 'quantity', 'unit_price', 'invoice_id'];
然后您可以这样做来保存相关数据。
$invoice = Invoice::create($validation);
$title = $request->title;
$quantity = $request->quantity;
$unit_price = $request->unit_price;
$sort_order = $request->sort_order;
$now = now();
$invoiceDetails = [];
for ($i = 0; $i < count($title); $i++) {
$invoiceDetails[] = [
'sort_order' => $sort_order[$i],
'title' => $title[$i],
'quantity' => $quantity[$i],
'unit_price' => $unit_price[$i],
];
}
$invoice->invoice_detail()->createMany($invoiceDetails);
现在如果你想获取数据,你可以像下面一样轻松获取它,
$invoice = Invoice::with('invoice_detail')->findOrFail($invoice_id);
然后在刀片或任何地方,例如刀片,
@foreach($invoice->invoice_detail as $invoice_item)
{{$invoice_item->unit_price}}
// all the Invoice_detail model colums
@endforeach
如果你想删除你可以在Cascade上做,但无论如何让我们在你的函数中做。
public function destroy($id)
{
$invoice = Invoice::findOrFail($id);
$invoice->invoice_detail()->delete();
$invoice->delete();
return redirect('invoice')->with('flash_message', 'Deleted');
}
Khayam,我尝试了一种不同的方法,但是你能给我一个想法如何删除发票和发票详细信息中的记录吗?发生的事情是它只删除发票数据库中的数据。
@foreach ($jointwo as $viewinvoices)
<tr>
<td> {{ $viewinvoices->id }} </td>
<td> {{ $viewinvoices->user }} </td>
<td> {{ $viewinvoices->company }} </td>
<td> {{ $viewinvoices->invoice_month }} </td>
<td> {{ $viewinvoices->invoice_id}} </td>
<td> <?php $quantity= $viewinvoices->quantity;
$un_price = $viewinvoices->unit_price;
$totalqp =$quantity*$un_price;
$totalqp;
$totalpercent = $totalqp * 1.10;
echo $totalpercent;
?></td>
<td>{{ $viewinvoices->created }}</td>
<td><button class="btn btn-primary">Edit</button>
<form method="POST" action="{{ url('/invoic' . '/' . $viewinvoices->id) }}" accept-charset="UTF-8">
{{ method_field('DELETE') }}
{{ csrf_field() }}
<button type="submit" class="btn btn-light btn-sm" title="Delete" onclick="return confirm("Confirm delete?")">Delete<i class="fa fa-trash-o" aria-hidden="true"></i></button>
</form>
</tr>
@endforeach
控制器
public function destroy(string $id)
{
Invoice::find($id)->delete();
// Invoice_detail::find($invoice_id)->delete();
return redirect('invoice')->with('flash_message', 'Deleted');
}
查看功能:
public function index()
{
$jointwo = DB::table('invoices')
->select('invoices.id', 'invoices.user', 'invoices.company', 'invoices.invoice_month', 'invoices.created','invoice_details.invoice_id', 'invoice_details.quantity', 'invoice_details.unit_price')->join('invoice_details', 'invoice_details.invoice_id', '=', 'invoices.id')->paginate(5);
return view('homepage',compact('jointwo'));
}