模型结合Laravel中的两个表

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

我有表“item”,“payment”,“join_payment”。

该项目有一个id,付款有id。 join_payment有行item_idpayment_id

付款可能包含许多项目,这些项目将在join_payment表中注册。

我想用这些项目记录日志,我目前正在控制器中执行此操作:

$log = Array();

$items = item::where("id",Auth::user()->id)->get();

foreach($items as $item){

$join_payment = join_payment::where("item_id",$item->id)->first();

 if(!array_key_exists($join_payment->payment_id,$log){
  $log[$join_payment->payment_id] = payment::where("id",$join_payment->payment_id)->first();
 }
 $log[$join_payment->payment_id][$item->id] = $item;
}

有没有办法在模型中推出这个?

php laravel
2个回答
3
投票

我建议使用Eloquent关系。 https://laravel.com/docs/5.5/eloquent-relationships#many-to-many。如果你调用连接表item_payment它会更容易:

class Item extends Model {
    public function payments(){
        return $this->belongsToMany(Payments::class)
    }
}

class Payment extends Model {
    public function items(){
        return $this->belongsToMany(Item::class)
    }
}

class ItemPayment extends Model {
    public function item(){
        return $this->belongsTo(Item::class)
    }
    public function payment(){
        return $this->belongsTo(Payment::class)
    }
}

然后,您可以通过多种方式访问​​所需的数据:

$items = Item::all();
foreach($items as $item){
    $item->payments; //returns all payments belonging to this item
}


$payments = Payment::all();
foreach($payments as $payment){
    $payment->items; //returns all items belonging to this payment
}


$itemPayments = ItemPayment::all();
foreach($itemPayments as $itemPayment){
    $itemPayment->item; //the item for this join
    $itemPayment->payment; //the payment for this join
}

很抱歉更改了您的班级和表名,但这些约定将使您的生活在Laravel中变得更轻松


1
投票

在你的Item模型中使用它

public function payment()
{
   return $this->hasOne('App\Payment','join_payment','payment_id','item_id');
}

然后在你循环检查

foreach($items as $item){
   dd($item->payment);
}
© www.soinside.com 2019 - 2024. All rights reserved.