【问题标题】:Fetch invoices by user id in Eloquent ORM在 Eloquent ORM 中按用户 ID 获取发票
【发布时间】:2026-01-03 08:05:01
【问题描述】:

我想获取用户使用 Eloquent ORM 提出的所有发票。

目前,我通过user.id 从连接表UsersInvoices 中获取invoice.id,然后根据ID 循环并从Invoices 表中获取发票。

$user = Sentry::getUser();
$invoiceIDs = UsersInvoice::where('user_id', '=', $user->id)->get()->toArray();
$invoices = array();

foreach ($invoiceIDs as $key => $row) {
    array_push($invoices, Invoice::find($row['invoice_id']));
}



$this->data['title'] = 'Invoices';
$this->data['invoices'] = $invoices;


/** render the template */
App::render('@invoices/pending/index.twig', $this->data);

但我认为这可以/应该由 ORM 通过建模用户和发票之间的关系来处理。

看起来我应该能够通过简单地将user.id 作为外键发布到发票表中来管理这个like so - 也许我不需要连接表,因为没有什么是独特的需要存储的关系...?

【问题讨论】:

  • 是的,您绝对应该使用不同的方法,而不是为每张发票运行查询。您可以使用关系(可能没有数据透视表)。

标签: php laravel orm eloquent


【解决方案1】:

注意:从我的手机发帖。抱歉,我不能这样放代码示例。

如果我理解正确的话,Users 和 Invoices 之间的关系是

- User hasMany Invoice

- Invoice belongsTo User 

如果是这样,那么您需要在 Eloquent 模型中设置它,方法是定义获取中继数据的关系和方法(至少在 User 模型中)。 Eloquent ORM 期望在 invoices 表中有一个 user_id 字段。

那么你可以这样做:

$user = User::find($id);

$user->invoices(); //assuming you put an invoices method in the User model

或者:

$invoice = Invoice::find($id);

$invoice->user(); //assuming you setup a user method in the Invoice model

更多关于关系的信息:http://laravel.com/docs/eloquent#relationships

【讨论】:

  • 你的例子User::relation()是错误的——你不能那样做。
  • 谢谢,贾雷克!我更正了伪代码以使其更准确。
【解决方案2】:

您似乎已将user_idinvoice_id 存储在单独的表中。 只需将user_id 保留在Invoices 表中,然后使用单个查询来获取所有内容。 并且也不要将结果转换为数组。

foreach( $invoices as $inv ) {
    echo $inv->invoice_id;
}

【讨论】: