首页 > 解决方案 > Laravel 关系将列组合到逗号分隔的字符串

问题描述

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

例如:

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

关系:

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

客户.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();
}

客户包.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

我希望我解释清楚..

标签: phplaravelrelationshipconcat

解决方案


您可以加入您的表,然后使用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();

推荐阅读