Laravel关系将列合并为逗号分隔的字符串

时间:2020-10-03 17:28:24

标签: php laravel relationship concat

在laravel应用程序中,我有3个表,分别为customerspackagescustomer_packages。我需要在package字符串中显示每个客户的每个comma separated

例如:

# | Customer     | Package(s)
------------------------------
1 | Customer - 1 | 123, 456, 789, ...  
2 | Customer - 2 | 456, 789, ...

关系:

customers -> hasMany -> customer_packages -> hasOne -> packages

Customer.php

public function customerPackage()
{
    return $this->hasMany(CustomerPackage::class);
}

public function index() 
{
    return self::select([
        'id',
        ...
    ])->with([
        'customerPackage:id,customer_id,package_id,package_amount',
        'customerPackage.package:id,title',
    ])
    ->where("status", \Common::STATUS_ACTIVE)
    ->get();
}

CustomerPackage.php

public function customer()
{
    return $this->belongsTo(Customer::class);
}

public function package()
{
    return $this->belongsTo(Package::class);
}

一切正常。但是,要获得所需的(逗号分隔)输出,我必须在程序包上运行循环并生成输出。

类似这样的东西:

@foreach($customers as $customer)
    <tr>
        ...
        <td>
            @foreach($customer->customerPackage as $package)
                @php
                    $array[] = $package->package->title;
                @endphp
            @endforeach

            {{ @implode(', ', $array) }}
        </td>
        ...
    </tr>
@endforeach

我希望我能清楚地解释一下。

1 个答案:

答案 0 :(得分:0)

您可以加入表格,然后使用GROUP_CONCAT获得这样的结果:

 return self::leftJoin('customer_packages','customer_packages.customer_id','customers.id')
        ->leftJoin('packages','packages.id','customer_packages.package_id')
            ->selectRaw("customers.id ,customers.name,GROUP_CONCAT(packages.id SEPARATOR ',') packages")
            ->groupBy(['customers.id','customers.name'])->get();