Вложенное красноречивое предложение where в laravel

Я создаю небольшое приложение в Laravel 5.4, где у меня есть модели: Interaction и InteractionSummary. Каждое Взаимодействие может быть создано Пользователем, и каждое резюме Взаимодействия содержит Контакт Компании, с которой он взаимодействовал. Итак, мои следующие модели:

Пользователь:

public function interactions()
{
    return $this->hasMany('App\Interaction');
}

Компания:

public function contacts()
{
    return $this->belongsToMany('App\Contact', 'company_contact', 'company_id','contact_id');
}

Контактное лицо:

public function companies()
{
    return $this
        ->belongsToMany('App\Company', 'company_contact','contact_id', 'company_id')->withTimestamps();
}

public function interactions()
{
    return $this->belongsToMany('App\Interaction', 'contact_client_interaction','contact_id', 'interaction_id');
}

Взаимодействие:

public function contactsAssociation()
{
    return $this->belongsToMany('App\Contact', 'contact_interaction',  'interaction_id', 'contact_id')->withPivot('company_id')->withTimestamps();
}

public function interactionSummaries()
{
    return $this->hasMany('App\InteractionSummary');
}

Обзор взаимодействия

public function interaction()
{
    return $this->belongsTo('App\Interaction');
}

public function client()
{
    return $this->belongsTo('App\Company', 'company_id');
}

Теперь я хочу получить предложение where, чтобы найти модель Company, упоминаемую как клиент в модели InteractionSummary, и получить все сводные данные каждой встречи, поэтому я попробовал что-то вроде этого:

$user  = Auth::user();
$summaries = $user->interactions() 
                ->whereHas('interactionSummary', function($query){
                    $query->where('client', 'like', '%'.$request->input.'%');
                })->get();

Выдает ошибку

Вызов неопределенного метода Illuminate\Database\Query\Builder::interactionSummary()

Любые предложения в этом приветствуются. Спасибо


person Nitish Kumar    schedule 12.08.2017    source источник


Ответы (2)


Доступ к отношению как property возвращает объект Collection.

Отношение доступа как метод даст вам объект Builder, чтобы вы могли вызвать для него метод whereHas.

Кроме того: у вас есть отношение interactionSummaries внутри вашей модели Interaction, а не interactionSummary.

Попробуй это

$user  = Auth::user();
$summaries = $user->interactions() 
                  ->whereHas('interactionSummaries', function($query) use ($request) {
                      $query->where('client', 'like', '%' . $request->input . '%');
                  })->get();
person Zayn Ali    schedule 12.08.2017
comment
Думаю, я делаю то же самое. - person Nitish Kumar; 12.08.2017
comment
@NitishKumar В своем вопросе вы делаете это $user->interactions->whereHas - person Zayn Ali; 12.08.2017
comment
Я получаю это Call to undefined method Illuminate\Database\Query\Builder::interactions() - person Nitish Kumar; 12.08.2017
comment
Эта ошибка указывает на то, что вы вызываете метод interactions() для объекта Builder, что означает, что $user не является моделью User, где находится ваш метод interactions. Пожалуйста подтвердите - person Zayn Ali; 12.08.2017
comment
Хорошо, я понял, но я получаю то же самое для interactionSummary, так что мне нужно создать метод для этого? Я имею в виду, даже если мне нужно, какие будут отношения? - person Nitish Kumar; 12.08.2017
comment
@NitishKumar, какую ошибку вы получаете? и, пожалуйста, обновите свой вопрос с помощью измененного кода. - person Zayn Ali; 12.08.2017
comment
Обновлено. Пожалуйста, просмотрите. - person Nitish Kumar; 12.08.2017
comment
Я обновил ответ, хотя вы очень хорошо меня направили. Спасибо. - person Nitish Kumar; 12.08.2017
comment
@NitishKumar Рад помочь вам :-) - person Zayn Ali; 12.08.2017

Вы должны попробовать это:

$summaries = $user->interactions
                ->whereHas('interactionSummary', function($query) use($request){
                    $query->where('client', 'like', '%'.$request->input.'%');
                })->get();
person AddWeb Solution Pvt Ltd    schedule 12.08.2017
comment
Это мне не помогает, я уже проверил, удалив запрос и передав пустую строку. Бывает такое же. - person Nitish Kumar; 12.08.2017
comment
@NitishKumar Хорошо, позвольте мне проверить это - person AddWeb Solution Pvt Ltd; 12.08.2017