Вылезает ошибка: Property [name] does not exist on the Eloquent builder instance. (View: C:\OSPanel\domains\MyFirstApp\resources\views\rooms\show.blade.php) Код метода: PHP: public function show($id) { $room = Room::join('people', 'person_id', '=', 'id'); return view('rooms.show', compact('room')); } Вьюшка: HTML: <div class="card"> <div class="card-body"> <div class="card-title"> <h4>{{ $room->name }}</h4> </div> <div class="card-img card-img__max" style="background-image: url({{ $room->image ?? asset('img/default.jpg') }})"></div> <p class="card-text">{{ $room->description }}</p> </div> <ul class="list-group list-group-flush"> <li class="list-group-item">Арендодатель: {{ $room->fio }}</li> <li class="list-group-item">Организация: {{ $room->name_organization }}</li> <li class="list-group-item">Площадь: {{ $room->square }} кв.м.</li> <li class="list-group-item">Стоимость: {{ $room->rent_price }} руб/мес</li> <li class="list-group-item">Дата добавления: {{ $room->created_at }}</li> </ul> <a href="" class="btn btn-outline-success">Заказать</a> <a href="{{ route('room.index') }}" class="btn btn-outline-primary">На главную</a> </div> У меня таблица rooms (помещения) связана внешним ключом person_id таблицы people (а в этой таблице id). Данные fio, name_organization берутся из people. Решил написать запрос через модель, а не через фасад DB. В чем я ошибся?
@lordconst, ну потому что Builder - это не модель --- Добавлено --- Вы до запроса дело не довели, методом get(), или first()
Добавил, теперь это SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in on clause is ambiguous (SQL: select * from `rooms` inner join `people` on `person_id` = `id`) Загуглил, что проблема с внешними ключами, но в упор не вижу ошибки. Ткните, пожалуйста, пальцем)
Откуда программе или мне знать, откуда ты берешь столбец id? из people или rooms? --- Добавлено --- главное сюда написать время есть, а инструкцию прочесть внимательно, времени нету.
теперь запрос выглядит так: PHP: $room = Room::join('people', 'person_id', '=', 'people.id')->first(); и во всех записях одни и те же данные из присоединенной таблицы. find() выдает ошибку Too few arguments to function Illuminate\Database\Eloquent\Builder::find(), 0 passed in C:\OSPanel\domains\MyFirstApp\app\Http\Controllers\RoomController.php on line 86 and at least 1 expected
А так хоть работает? PHP: $room= DB::table('room') ->leftJoin('people', 'room.person_id', '=', 'people.id') ->get();
нет, таблица roomS, но все равно не работает Property [name] does not exist on this collection instance. (View: C:\OSPanel\domains\MyFirstApp\resources\views\rooms\show.blade.php)
не существует в этой коллекции... я не совсем уж дурак, чтобы не перевести сразу. но как это исправить?
Ну раз тебе говорят что Нет там, надо или добавить это поле в запрос, либо не пытаться выводить его в вьюхе.
Здесь все такие умные прямо, смотрю. Ежели новичку до всего нужно догадаться самому, то для чего вообще форум? Не умеют новички правильно искать информацию, поймите уже. Вместо того, чтобы пальцем в небо тыкать помогли бы лучше сразу. Вчера весь день потрачен, сегодня половина дня убита. Или свое самомнение хочется потешить? Я сам модератор в онлайн-игре и каким бы глупым ни был вопрос или проблема от игрока, все коллеги всегда отвечают нормально. А теперь по теме: я смотрю видеоурок и у автора все получилось, я на свои названия поменял поля: PHP: $room= Room::join('people', 'person_id', '=', 'id'); Property [name] does not exist on the Eloquent builder instance. Как пофиксить?
Направить на документацию, поделиться опытом в действительно интересных случаях Никто за вас вашу задачу решать не будет. По вашему вопросу уже дан ответ. Builder - не модель. За содержание видео-уроков отвечает их автор. Мы здесь не причём и ничего тебе не должны --- Добавлено --- Моё лично мнение, хотя не все тут его разделяют, что новичку вообще нечего делать в Laravel.
Смысл такой. Что ты не везде изменил названия полей, а требуешь у Лары результат с новым полем name. Который она не знает. Вангую, что или в самой бд поле старое, либо ещё где... За неимением всего кода сказать трудно.
Не, там проще все. Model::join не возвращает результат запроса, она возвращает Builder, а ТС с ним обращается, как с результатом запроса. --- Добавлено --- Я на это уже указывал
Тогда ->get(); ее.... А тс нужно освоить важную и нужную команду dd(); и выводить все непонятные результаты через нее, что явно видеть что это...
да нет, зачем мне их изменять? как были, так и есть. добавил, такую ошибку выдает: SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in on clause is ambiguous (SQL: select * from `rooms` inner join `people` on `person_id` = `id`) Подумал, что нужно указать таблицу и после нее уже поле, по которому связываем, стало вот так: PHP: $room= Room::join('people', 'person_id', '=', 'people.id')->get(); Но он все равно прежнюю ошибку выдает, поле name не найдено
get() возвращает коллекцию моделей. Не модель. https://laravel.com/docs/7.x/collections - про коллекции. Коротко - это такая удобная надстройка над массивами. Я подсказывал про first(), но тебе что-то не понравилось. Но мы так методом тыка не можем перебирать методы, надо значть, что за задача решается. --- Добавлено --- Вообще, именно этим не люблю видео уроки "делай как я, и всё получится"... Понимания происходящего они дают ноль...
извиняюсь за беспокойство, но все-таки не работает. Точнее, работает, но не так, как нужно. Во-первых, я вспомнил что уже пробовал метод first, но с его помощью он выводит одного человека (по логике страницы) на ВСЕХ карточках, хотя в базе их много и все они разные. Как это пофиксить? p.s. попробовал ради интереса создать новую карточку, и на ней Автор и Организация (поля из people таблицы) также отображаются как и на всех карточках, даже попробовал null по умолчанию поставить в бд
Я же не знаю чего вам надо. Метод first() возвращает первый элемент результата запроса, метод get() - коллекцию элементов. А что у вас там за rooms - я не телепат. Вообще, у ларки нормальная документация, прочитать и выбрать метод.... --- Добавлено --- У вас там вон какой-то параметр передаётся в экшн, а потом нигде не юзается
ежели нашел бы там ответ, не написал бы сюда. А ввиду неопытности, В ТОМ ЧИСЛЕ Так, ладно. https://laravel.com/docs/5.8/queries#joins Вот здесь я читал информацию только что. В соответствии написал такой запрос: PHP: public function show($id) { $room = DB::table('rooms') ->join('people', 'rooms.person_id', '=', 'people.id') ->select('rooms.*', 'people.*') ->get(); return view('rooms.show', compact('room')); } В итоге ошибка: Property [name] does not exist on this collection instance. Окей, но а как получить не коллекцию, а просто результат запроса? Гуглю еще, нашел вот это: https://laravel.ru/docs/v5/queries#получение_результатов Нахожу абзац получения одной строки, пишу метод first и он снова выдает мне одного и того же человека во всех карточках. И что теперь? Мне награду объявить за голову этой проблемы? Или как попросить, чтобы объяснили разницу и как нужно исправить в этом случае? Насколько я сам понял, с коллекциями мы работаем ТОЛЬКО с помощью цикла foreach, а как быть в обычным запросом?