我有一个expenses
和expense_splits
表。
我想将两者结合到一个结果集中。每个expense_splits
都应该从其所属的费用中添加属性。似乎有很多方法可以解决这个问题,但似乎都没有。
例如,像这样的leftjoin几乎适合我,但它会删除我的所有费用id #s并且仅保留expense_splits
。
$expenses = DB::table('expenses')
-leftJoin('expense_splits', 'expenses.id', '=', 'expense_splits.expense_id')
->get();
理想情况下,我需要费用表中的所有属性显示在我的expense_splits
结果中。除非两个表中的属性相同,否则显示expense_splits
属性(jelftjoin为我做的...但它会删除我的expenses.id
)。
我也可以合并/推送我的两个系列。这是在一个结果集中显示它们的快速方法。但是,我不确定如何为每个expense_splits
添加费用属性。我需要将我的expense_splits
视为常规费用(如果费用有分割,我就不能将其显示出来......但我稍后会担心这一点)。我的应用程序上任何地方都不会有这种情况。
$splits = ExpenseSplit::all();
$expenses = Expense::all();
$expenses = $expenses->merge($splits);
我还可以附加到我的ExpenseSplits
结果,但老实说,idk放在哪里或者它是否有意义。我需要将它放在每次调用Expense::all()
时调用的地方,我无法复制和放置它。粘贴整个应用程序。
$expense_split = ExpenseSplit::find(34);
$expense_split->receipt = $expense_split->expense->receipt;
$expense_split->receipt_html = $expense_split->expense->receipt_html;
$expense_split->check_id = $expense_split->expense->check_id;
放置此代码的最佳位置是什么,因此它可以像Expense::all()
一样简单,并且将包含来自expense_splits
表的这些拆分。当然,我该如何做到这一点。似乎有很多方法可以完成这项工作。
谢谢,Patryk
数据库架构: 费用表:(简化) | id | expense_date |金额| project_id |收据| paid_by | check_id
EXPENSE_SPLITS表:(简化) | id | expnese_id |金额| project_id |
答案 0 :(得分:0)
所以我不确定你是如何完成模型的,但这是它应该是什么样子的一个例子:
class Expenses extends Model
{
protected $table = 'expenses';
public function splitExpenses()
{
return $this->hasMany('App\Models\ExpenseSplits');
}
}
class ExpenseSplits extends Model
{
protected $table = 'expense_splits';
public function expenses()
{
return $this->belongsTo('App\Models\Expenses');
}
}
$expenses = Expenses::where('id', 1)->with('splitExpenses')->get();
所以基本上你的$ expenses应该包含所有拆分费用对象(如果存在)。
阅读: https://laravel.com/docs/5.5/eloquent-relationships
由于您使用的是Eloquent,因此无需使用任何DB :: table。如果您正确设置关系,它会为您处理所有事情。