Laravel: итерация по коллекции соединений - PullRequest
0 голосов
/ 30 июня 2018

У меня есть коллекция БД laravel, которая извлекает данные с помощью объединений. Как это:

public static function getAllClientData(){

return DB::table('clients')
    ->join('accounts', 'clients.id',  '=', 'accounts.client_id')
    ->join('addresses', 'clients.address_id',  '=', 'addresses.id')
    ->select('clients.*', 'accounts.*', 'addresses.*')
    ->get();
}

Теперь я хочу получить значения возвращенной коллекции БД. Тем не менее, таблицы счетов и клиентов содержат как столбец «комментарий». Этот столбец не является одним и тем же столбцом и содержит разные значения. Как я могу перебрать возвращенную коллекцию БД и получить доступ / получить значение указанного столбца?

Я уже пробовал это до сих пор:

foreach($data as $item){
    echo $item->addresses.comment;
    echo $item->accounts.comment;
}

Однако это не работает. Как я могу сказать Laravel получить значение комментария к столбцу из адресов таблицы, а также из учетных записей таблицы?

1 Ответ

0 голосов
/ 30 июня 2018

Вы можете использовать красноречивый способ с нетерпением загрузить ваши отношения

$clients = Client::with(['accounts','addresses'])->get();

Когда вы перебираете $clients на каждой итерации, у вас будет коллекция для связанных адресов и учетных записей для каждого клиента

class Client extends Model{

    public function accounts(){
       return $this->hasMany('App\Accounts','client_id');
    }

}

Кроме того, ваши отношения с адресами выглядят подозрительно, если у клиента есть один адрес, тогда хорошо иметь идентификатор адреса в таблице клиентов. Если у клиента есть несколько адресов, то таблица адресов должна иметь client_id в качестве внешнего ключа,

Если у клиента один адрес

public function address()
{
    return $this->belongsTo('App\Address', 'address_id');
}

Если у клиента более одного адреса

public function addresses(){
   return $this->hasMany('App\Address','client_id');
}

Для вашего исходного запроса вам нужно присвоить им уникальный псевдоним, если две таблицы имеют одинаковые имена для столбцов

DB::table('clients')
    ->join('accounts', 'clients.id',  '=', 'accounts.client_id')
    ->join('addresses', 'clients.address_id',  '=', 'addresses.id')
    ->select('clients.*', 'accounts.*', 'addresses.*', DB::raw('accounts.comments as account_comments'),DB::raw('addresses.comments as address_comments'))
    ->get();

Также не рекомендуется выбирать все столбцы из объединенного запроса, выбирайте только те столбцы, которые вам действительно нужны

...