Используйте сводную таблицу для извлечения данных из главной таблицы - PullRequest
0 голосов
/ 29 января 2019

Я использую две таблицы и сводную таблицу

Таблица 1 с именем calendars.

Таблица 2 с именем calendar_groups.

Сводная таблица calendar_calendar_group.

Я пытаюсь получить данные из таблицы 1 на основе значения where в сводной таблице,Где calendar_groups_id = 1, затем используйте calendar_id для получения данных из таблицы 1. Я не могу заставить их работать.

$event = new Calendar();
$event->orderBy('start', 'asc')
    ->whereHas('calendar_groups', function ($q) {
        $q->wherePivot('calendar_groups_id', '=', '1');
    })->with('calendar_groups')
    ->first();

Это дает мне следующую ошибку:

SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец «pivot» в «выражении where»

Это отношение:

public function calendar_groups()
    {
        return $this->belongsToMany(CalendarGroup::class);
    }

Ваша помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Хорошо, наконец-то все заработало.

Я воспользовался вашими предложениями, но до сих пор не понимаю его небольшую часть.Когда я использую предложения:

$event = new Calendar;
                $event->orderBy('start', 'asc')
            ->whereHas('calendar_groups', function($q) {
                    $q->where('calendar_group_id', '=', '1');
                })->with('calendar_groups')

            ->first();

, я получаю пустую коллекцию.

Но если я запускаю это:

$event = Calendar::orderBy('start', 'asc')
        ->whereHas('calendar_groups', function($q) {
                $q->where('calendar_group_id', '=', '1');
            })->with('calendar_groups')

        ->first();

, я получаю желаемые результаты

Может кто-нибудь сказать мне разницу между, чтобы я мог учиться на этом?

0 голосов
/ 30 января 2019

Я думаю, @Tpojka прямо здесь.Если вы пытаетесь получить экземпляры Календаря, которые принадлежат к нужной Календарной группе, то заменить код должен выглядеть следующим образом:

$event = new Calendar();
$group = 1;
$event->orderBy('start', 'asc')
    ->whereHas('calendar_groups', function ($q) use ($group) {
        //$q->wherePivot('calendar_groups_id', '=', $group);
        $q->where('id', '=', $group);
    })->with('calendar_groups')
    ->first();

Если я правильно читаю документацию, wherePivot() следует использовать следующим образом:

$event = new Calendar();
$event->calendar_groups()->wherePivot('some_pivot_column',1)->get();

Но это вернет вам CalendarGroup экземпляров.

Если вы захотите сделать это через Eloquent, но не пройдя весь путь до CalendarGroup, тогда вывероятно, нужно создать модель (назовем ее CalendarCalendarGroupPivot) для сводной таблицы и добавить еще одно отношение (hasMany('CalendarCalendarGroupPivot')) к вашей Calendar модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...