在发票上保存主键时,如何在发票详细信息的外键上保存主键?

问题描述 投票:0回答:2

我有一个包含主键 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);
laravel sqlite foreign-keys primary-key
2个回答
0
投票

您可以拥有许多发票详细信息,并且您已经编写了一种关系,并且您正在保存许多记录。

另一方面,您可以使用关系来保存相关数据,也可以手动完成。

首先在发票模型中更改您的关系。

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');

}

-1
投票

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(&quot;Confirm delete?&quot;)">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'));
}
© www.soinside.com 2019 - 2024. All rights reserved.