使用Laravel Eloquent将两个表合并到一个结果集中。合并/添加/加盟

时间:2017-10-11 22:14:09

标签: php laravel eloquent

我有一个expensesexpense_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 |

1 个答案:

答案 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。如果您正确设置关系,它会为您处理所有事情。