За последние 24 часа нас посетили 22045 программистов и 989 роботов. Сейчас ищут 656 программистов ...

Ошибка в методе show

Тема в разделе "Laravel", создана пользователем lordconst, 20 мар 2020.

  1. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Вылезает ошибка: Property [name] does not exist on the Eloquent builder instance. (View: C:\OSPanel\domains\MyFirstApp\resources\views\rooms\show.blade.php)
    Код метода:
    PHP:
    1. public function show($id)
    2.     {
    3.         $room = Room::join('people', 'person_id', '=', 'id');
    4.  
    5.         return view('rooms.show', compact('room'));
    6.     }
    Вьюшка:
    HTML:
    1. <div class="card">
    2.                 <div class="card-body">
    3.                     <div class="card-title">
    4.                         <h4>{{ $room->name }}</h4>
    5.                     </div>
    6.                     <div class="card-img card-img__max" style="background-image: url({{ $room->image ?? asset('img/default.jpg') }})"></div>
    7.                     <p class="card-text">{{ $room->description }}</p>
    8.                 </div>
    9.                 <ul class="list-group list-group-flush">
    10.                     <li class="list-group-item">Арендодатель: {{ $room->fio }}</li>
    11.                     <li class="list-group-item">Организация: {{ $room->name_organization }}</li>
    12.                     <li class="list-group-item">Площадь: {{ $room->square }} кв.м.</li>
    13.                     <li class="list-group-item">Стоимость: {{ $room->rent_price }} руб/мес</li>
    14.                     <li class="list-group-item">Дата добавления: {{ $room->created_at }}</li>
    15.                 </ul>
    16.                 <a href="" class="btn btn-outline-success">Заказать</a>
    17.                 <a href="{{ route('room.index') }}" class="btn btn-outline-primary">На главную</a>
    18.             </div>
    У меня таблица rooms (помещения) связана внешним ключом person_id таблицы people (а в этой таблице id). Данные fio, name_organization берутся из people. Решил написать запрос через модель, а не через фасад DB.
    В чем я ошибся?
     
  2. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @lordconst мне кажется у тебя там очень херовый видеоурок. Кинь как ссылку, даже интересно
     
  3. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    а как сделать тогда это объединение таблиц?
     
  4. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    @lordconst, ну потому что Builder - это не модель :)
    --- Добавлено ---
    Вы до запроса дело не довели, методом get(), или first()
     
  6. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Добавил, теперь это SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in on clause is ambiguous (SQL: select * from `rooms` inner join `people` on `person_id` = `id`)
    Загуглил, что проблема с внешними ключами, но в упор не вижу ошибки. Ткните, пожалуйста, пальцем)
     
  7. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Откуда программе или мне знать, откуда ты берешь столбец id? из people или rooms?
    --- Добавлено ---
    главное сюда написать время есть, а инструкцию прочесть внимательно, времени нету.
     
  8. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    теперь запрос выглядит так:
    PHP:
    1. $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
     
  9. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    А так хоть работает?
    PHP:
    1. $room= DB::table('room')
    2.             ->leftJoin('people', 'room.person_id', '=', 'people.id')
    3.             ->get();
     
  10. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    нет, таблица roomS, но все равно не работает
    Property [name] does not exist on this collection instance. (View: C:\OSPanel\domains\MyFirstApp\resources\views\rooms\show.blade.php)
     
  11. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    переведи с английского?
     
  12. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    не существует в этой коллекции... я не совсем уж дурак, чтобы не перевести сразу. но как это исправить?
     
  13. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    Ну раз тебе говорят что Нет там, надо или добавить это поле в запрос, либо не пытаться выводить его в вьюхе.
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    В коллекции поля быть не может

    А чтобы прочитать в документации разницу между моделью и коллекцией?
     
  15. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Здесь все такие умные прямо, смотрю. Ежели новичку до всего нужно догадаться самому, то для чего вообще форум? Не умеют новички правильно искать информацию, поймите уже.
    Вместо того, чтобы пальцем в небо тыкать помогли бы лучше сразу. Вчера весь день потрачен, сегодня половина дня убита.
    Или свое самомнение хочется потешить?
    Я сам модератор в онлайн-игре и каким бы глупым ни был вопрос или проблема от игрока, все коллеги всегда отвечают нормально.
    А теперь по теме: я смотрю видеоурок и у автора все получилось, я на свои названия поменял поля:
    PHP:
    1. $room= Room::join('people', 'person_id', '=', 'id');
    Property [name] does not exist on the Eloquent builder instance. Как пофиксить?
     
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Направить на документацию, поделиться опытом в действительно интересных случаях

    Никто за вас вашу задачу решать не будет. По вашему вопросу уже дан ответ. Builder - не модель.

    За содержание видео-уроков отвечает их автор.

    Мы здесь не причём и ничего тебе не должны
    --- Добавлено ---
    Моё лично мнение, хотя не все тут его разделяют, что новичку вообще нечего делать в Laravel.
     
    twim32 и EvgeniyTSI нравится это.
  17. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    Смысл такой. Что ты не везде изменил названия полей, а требуешь у Лары результат с новым полем name. Который она не знает.

    Вангую, что или в самой бд поле старое, либо ещё где... За неимением всего кода сказать трудно.
     
  18. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Не, там проще все. Model::join не возвращает результат запроса, она возвращает Builder, а ТС с ним обращается, как с результатом запроса.
    --- Добавлено ---
    Я на это уже указывал
     
  19. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    Тогда ->get(); ее....

    А тс нужно освоить важную и нужную команду dd(); и выводить все непонятные результаты через нее, что явно видеть что это...
     
  20. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    да нет, зачем мне их изменять? как были, так и есть.
    добавил, такую ошибку выдает: 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:
    1. $room= Room::join('people', 'person_id', '=', 'people.id')->get();
    Но он все равно прежнюю ошибку выдает, поле name не найдено
     
  21. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    get() возвращает коллекцию моделей. Не модель. https://laravel.com/docs/7.x/collections - про коллекции. Коротко - это такая удобная надстройка над массивами. Я подсказывал про first(), но тебе что-то не понравилось. Но мы так методом тыка не можем перебирать методы, надо значть, что за задача решается.
    --- Добавлено ---
    Вообще, именно этим не люблю видео уроки "делай как я, и всё получится"... Понимания происходящего они дают ноль...
     
  22. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    я его пробовал, но видимо без people.id, а теперь заработало.
    Спасибо, проблема решена
     
  23. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    извиняюсь за беспокойство, но все-таки не работает. Точнее, работает, но не так, как нужно.
    Во-первых, я вспомнил что уже пробовал метод first, но с его помощью он выводит одного человека (по логике страницы) на ВСЕХ карточках, хотя в базе их много и все они разные.
    Как это пофиксить?
    p.s. попробовал ради интереса создать новую карточку, и на ней Автор и Организация (поля из people таблицы) также отображаются как и на всех карточках, даже попробовал null по умолчанию поставить в бд
     
    #23 lordconst, 23 мар 2020
    Последнее редактирование: 23 мар 2020
  24. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Я же не знаю чего вам надо. Метод first() возвращает первый элемент результата запроса, метод get() - коллекцию элементов. А что у вас там за rooms - я не телепат. Вообще, у ларки нормальная документация, прочитать и выбрать метод....
    --- Добавлено ---
    У вас там вон какой-то параметр передаётся в экшн, а потом нигде не юзается
     
  25. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    ежели нашел бы там ответ, не написал бы сюда. А ввиду неопытности, В ТОМ ЧИСЛЕ
    Так, ладно. https://laravel.com/docs/5.8/queries#joins
    Вот здесь я читал информацию только что. В соответствии написал такой запрос:
    PHP:
    1. public function show($id)
    2.     {
    3.         $room = DB::table('rooms')
    4.             ->join('people', 'rooms.person_id', '=', 'people.id')
    5.             ->select('rooms.*', 'people.*')
    6.             ->get();
    7.  
    8.         return view('rooms.show', compact('room'));
    9.     }
    В итоге ошибка: Property [name] does not exist on this collection instance. Окей, но а как получить не коллекцию, а просто результат запроса?
    Гуглю еще, нашел вот это: https://laravel.ru/docs/v5/queries#получение_результатов
    Нахожу абзац получения одной строки, пишу метод first и он снова выдает мне одного и того же человека во всех карточках.
    И что теперь? Мне награду объявить за голову этой проблемы? Или как попросить, чтобы объяснили разницу и как нужно исправить в этом случае? Насколько я сам понял, с коллекциями мы работаем ТОЛЬКО с помощью цикла foreach, а как быть в обычным запросом?