SQL Выбор данных из двух таблиц, одна строка -> несколько строк - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть следующие две таблицы:

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

Я загружаю таблицу html в блейд laravel, чтобы показать всех клиентов, и мне нужна ячейка таблицы с телефонами, сохраненными для каждого клиента.

Таким образом, у одного клиента может не быть телефонов, только один или несколько телефонов. Мне нужно получить каждого клиента с его телефонами в одном ряду, или есть лучший способ сделать это?

Если я сделаю что-то подобное, результаты получат по одной строке на телефон с дублирующимися данными:

 $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

Я пробовал несколько вещей, но ничего не работает. Спасибо

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Вместо того, чтобы объединять ваши таблицы, что иногда является анти-паттерном, использующим Eloquent. Используйте Eloquent мутаторы, чтобы решить вашу проблему.

Определите отношения с телефонами и мутатором.

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

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

Чтобы использовать мутатор, просто выберите вашу модель и получите к ней доступ. Для оптимизации производительности загрузите телефоны с помощью метода with (), который загружает отношения.

Customer::with('phones')->find(1)->phoneNumbers; // [666777888,111222333,444555666]
0 голосов
/ 14 февраля 2020

Вы должны сгруппировать своих клиентов по идентификатору и использовать group_concat для извлечения всех телефонных номеров в виде строки, разделенной запятыми. Это должно выглядеть примерно так:

$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();
...