Выберите конкретное значение столбца из нескольких реляционных таблиц, используя условие where в Laravel ORM - PullRequest
0 голосов
/ 30 июня 2019

У меня есть две таблицы с именами contacts и clients.Обе таблицы имеют group_id как foreign_key.Теперь я хочу получить значение phone столбца из обеих таблиц, когда пользователь $request->groupid найдет группу из таблицы groups.Я пытаюсь что-то вроде этого.Но получается пустой массив.Может кто-нибудь помочь мне, пожалуйста!

$getPhoneNumbers = Group::with(['hasContacts' => function($query){
                             $query->select('phone')->where('is_active', 1);
                        }])->with(['clients' => function($q){
                             $q->select('phone')->where('status', 1);
                        }])->where('id', $request->groupid)->get();

В Группа Модель -

public function clients()
{
    return $this->hasMany('App\Client', 'group_id', 'id');
}

public function hasContacts()
{
    return $this->hasMany('App\Contact', 'group_id', 'id');
}

Ответы [ 2 ]

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

Вам также нужно выбрать внешний ключ group_id, который требуется Laravel для соответствия результатов активной загрузки их родителям:

$getPhoneNumbers = Group::with(['hasContacts' => function($query){
                             $query->select('group_id', 'phone')->where('is_active', 1);
                        }])->with(['clients' => function($q){
                             $q->select('group_id', 'phone')->where('status', 1);
                        }])->where('id', $request->groupid)->get();
0 голосов
/ 30 июня 2019

Если вы хотите использовать методы отношений, вы должны сначала получить объект группы, а затем вызвать их.Также, пожалуйста, переименуйте hasContacts() в contacts(), чтобы следовать соглашениям.

$group = Group::find($request->groupid);

if (!$group) {
    # group not found
}

$clientPhoneNumbers = $group->clients()->where('status', 1)->pluck('phone')
$contactPhoneNumbers = $group->contacts()->where('is_active', 1)->pluck('phone')

Это использует pluck, чтобы получить один столбец как красноречивый Collection.Вы можете использовать $clientPhoneNumbers->toArray(), чтобы получить телефонные номера в виде массива (и аналогично для других Collection).

Модель группы:

public function clients()
{
    return $this->hasMany('App\Client', 'group_id', 'id');
}

public function contacts()
{
    return $this->hasMany('App\Contact', 'group_id', 'id');
}
...