Laravel Eloquent:使用belongsToMany关系检索唯一值

时间:2018-03-18 22:29:27

标签: eloquent

有了Eloquent,我很难在三张桌子之间建立关系:

t_orders列出了与

相关的所有订单和customer_id
+----------+-------------+
| order_id | customer_id |
+----------+-------------+
|        1 |           5 |
|        2 |           3 |
|        3 |           1 |
+----------+-------------+

t_orders_items列出每个订单的项目(fabrication_orders)

+----------+-------------------+
| order_id | fabrication_order |
+----------+-------------------+
|        1 |                 1 |
|        1 |                 2 |
|        2 |                 3 |
|      ... |               ... |
+----------+-------------------+

最后t_customer表给了我一些关于客户的信息

+-------------+---------------+
| customer_id | customer_name |
+-------------+---------------+
|           1 | Foo           |
|           3 | Bar           |
|           5 | Fun           |
+-------------+---------------+

我只想知道给定的fabrication_order(总是唯一的)关联的客户名称。因此,fabrication_order = 2,我会得到Fun

阅读Eloquent的文档我认为t_orders会以某种方式扮演数据透视表的角色。

所以我写了以下关系:

class OrderItem extends Model
{
    ...
    public function customer(){
        return
            $this->belongsToMany('App\Customer', 't_orders','order_id',
            'customer_id', 'order_id', 'customer_id');
    }
}

唯一的缺点是它返回一个集合而不是唯一值。

"customer":[{"customer_id":5,"customer_name":"Fun"..}]

我希望实现:

"customer":{"customer_id":5,"customer_name":"Fun"..}

当然,收藏只有一个价值,但我想把事情写得更清洁。

1 个答案:

答案 0 :(得分:1)

您可以使用两个单独的BelongsTo关系:

OrderItemOrderOrderCustomer

然后像这样访问客户:

$orderItem->order->customer

如果您需要它作为JSON字符串中的属性:

class OrderItem extends Model
{
    $appends = ['customer'];

    public function getCustomerAttribute() {
        return $this->order->customer;
    }
}