我有表“item”,“payment”,“join_payment”。
该项目有一个id
,付款有id
。 join_payment有行item_id
和payment_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;
}
有没有办法在模型中推出这个?
我建议使用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中变得更轻松
在你的Item模型中使用它
public function payment()
{
return $this->hasOne('App\Payment','join_payment','payment_id','item_id');
}
然后在你循环检查
foreach($items as $item){
dd($item->payment);
}