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]
我有以下两个 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]