SQL Select数据来自两个表,一行->多行

SQL Select data from two tables, one row -> multiple rows

我有以下两个 table:

customers:  |  phones:
--------------------------------------
id          |  id
name        |  owner (FK_CUSTOMERS)
address     |  number

我在 laravel blade 中加载 html table 以显示所有客户,我想要一个 table 单元格 phone 为每个客户保存。

因此一位客户可能没有 phone,只有一个或多个 phone。我需要在一行中检索每个客户的 phone,或者有更好的方法吗?

如果我这样做会导致每 phone 一行有重复数据:

 $customers = DB::table('customers')
        ->join("phones","customers.id", "=", "phones.owner")
        ->where("phones.group",1)
        ->select(
            'customers.id',            
            'customers.name',            
            'customers.fiscalNumber',            
            'customers.disscount',   
            'customers.billAddress',   
            'customers.tax',
            'phones.number'                   
        )
        ->get();

我想要这个:

id | name    | address          | phones
5  | Michael | fake address 123 | 666777888,111222333,444555666

我尝试了几种方法,但都没有用。谢谢

您应该按 id 对客户进行分组,并使用 group_concat 将所有 phone 号码提取为逗号分隔的字符串。它应该看起来像这样:

$customers = DB::table('customers')
    ->join("phones","customers.id", "=", "phones.owner")
    ->where("phones.group",1)
    ->select(
        'customers.id',
        'customers.name',
        'customers.fiscalNumber',
        'customers.disscount',
        'customers.billAddress',
        'customers.tax',
        DB::raw('group_concat(phones.number) as number')
    )
    ->groupBy('customers.id')
    ->get();

而不是连接您的表,这有时是使用 Eloquent 的反模式。使用 Eloquent 突变器来解决您的问题。

定义与音素和变元的关系。

class Customer {
    public function phones() {
        return $this->hasMany(Phone::class, 'owner');
    }

    public function getPhoneNumbersAttribute() {
        return implode(',', $this->phones->pluck('number')->all());
    }
}

要使用你的 mutator,只需获取你的模型并访问它。为了性能优化,使用 with() 方法加载电话,即急于加载关系。

Customer::with('phones')->find(1)->phoneNumbers; // [666777888,111222333,444555666]