Laravel 5.7, Eloquent: свойство [X] не существует в этом экземпляре коллекции, отношение «многие ко многим» - PullRequest
0 голосов
/ 23 октября 2019

Я получил эти две таблицы (Estado (Status) и Proyecto (Proyect)), у которых есть сводная таблица между EstadoProyecto (statusProyect), я пытаюсь получить доступ только к тем проектам, которые имеют 2 или 3 в своихПоле id_status (id_estado), которое имеет самую последнюю дату. Работает при использовании find (используя 2 или 3), но выдает ошибку. «Eloquent: свойство [proyectos] не существует в этом экземпляре коллекции, отношение« многие ко многим »» при попытке отправить массив в метод find или при использовании метода get. Это выдает мне ту же ошибку, когда я не использую метод find только с одним значением. Вот мои модели и запрос, который я пытаюсь использовать. модель1 модель2 модель3

Это запрос, который работает прямо сейчас: запрос Заранее спасибо. Диего:)

1 Ответ

0 голосов
/ 23 октября 2019

Ваш запрос возвращает коллекцию, потому что может быть несколько записей для вашей модели, возвращенных методом find, который предоставляет Eloquent, поэтому вы можете использовать метод first, например:

$estados = Estado::whereHas('proyectos', function ($query) {
    $query->whereIn('id_estado', [2, 3])
        ->orderBy('fecha_estado', 'DESC');
})
    ->with('proyectos', function ($query) {
        $query->whereIn('id_estado', [2, 3])
            ->orderBy('fecha_estado', 'DESC');
    })
    ->first();

С помощью приведенного выше фрагмента для получения нескольких результатов, соответствующих этим условиям, вам нужно всего лишь заменить метод first на get

. Приведенный выше код дает вам экземпляр единой модели Estado. .

В противном случае, если вы собираетесь использовать что-то в соответствии с исходным подходом, вы можете использовать get и возвращать коллекцию, вы можете перебирать их в цикле foreach:

$estados = Estado::whereHas('proyectos', function ($query) {
    $query->orderBy('fecha_estado', 'DESC');
})
    ->with('proyectos')
    ->get();

foreach ($estados as $estado) {
    $estado->proyectos->id;
}

Или вы можете получить доступ к элементам в коллекции, как к массиву, при условии, что вы знаете, что в ваших результатах обязательно есть запись:

$estados[0]->proyectos->id;

Если вы хотите получить только один результат, используйте EloquentМетод first часто является лучшим вариантом для этого.

Надеюсь, это поможет!

Дополнительная информация:

Метод find вEloquent может принимать либо одно значение, либо массив значений в качестве аргумента, и в случае, если ему не передано значение или массив значений передан, коллекция может быть возвращена, а не экземпляр одной модели. .

С другой стороны, метод get можно использовать без предоставления каких-либо аргументов и каждый раз будет возвращать коллекцию (хотя они все равно могут не содержать элементов, если базовый запрос не дал результатов)

...