За последние 24 часа нас посетили 21983 программиста и 994 робота. Сейчас ищут 679 программистов ...

Отбор строк в методе index

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

  1. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Имеется страница с навигацией, один из элементов - выпадающее меню. Кнопки Все тикеты, Голосования и Объявления. Удалось сделать вывод вообще всех строк, как раз страница Все тикеты. Но как вывести на отдельные страницы только те тикеты, что соответствуют названию?
    В базе данных есть поле type, принимает значения Объявление или Голосование.
    PHP:
    1. class TicketController extends Controller
    2. {
    3.     public function index() {
    4.  
    5.         $tickets = Ticket::join('persons', 'person_id', '=', 'persons.id')->get();
    6.  
    7.         return view('tickets.index', compact('tickets'));
    8.     }
    9. }
     

    Вложения:

  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Есть такая штука в SQL, where называется. И о чудо, в ларавель оно тоже есть.... Ты опять нарываешься на перезапись id при джоине, кстати...
     
  3. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Про where я знаю, я имел ввиду как нужно один и тот же метод index использовать в разных страницах с разными условиями (в моем случае по полю type).
    Перезапись? Чем это чревато и как правильно тогда соединять таблицы? В этот раз я прописал связи в моделях, так как их использовать именно на связь с таблицами?
    Допустим, вот связь модели Ticket и модели Person:
    PHP:
    1. class Ticket extends Model
    2. {
    3.     public function person() {
    4.         return $this->belongsTo('App\Person');
    5.     }
    6.     public function result_ticket() {
    7.         return $this->hasOne('App\ResultTicket');
    8.     }
    9.     public function comment() {
    10.         return $this->hasMany('App\Comment');
    11.     }
    12. }
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    не не знаю чего вы там накодили
    но смысл примерно такой
    PHP:
    1. public function index($slug = null)
    2. {
    3. if ($slug) {
    4. // конкретного типа
    5. $tickets = Ticket::where('type',$slug)->join('persons', 'person_id', '=', 'persons.id')->get();
    6. } else {
    7. // все подряд
    8. $tickets = Ticket::join('persons', 'person_id', '=', 'persons.id')->get();
    9. }
    10.  
    11. ну и маршруты разные для разных пунктов - а там вызов контроллера - либо с параметром. либо без
    12. }
     
  5. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    спасибо, а в ссылки как это прописать? Вот с Все тикеты понятно как, а остальные как параметр передать?
    HTML:
    1. <a class="dropdown-item" href="{{ route('tickets.index') }}">Все тикеты</a>
    2.                         <a class="dropdown-item" href="/">Объявления</a>
    3.                         <a class="dropdown-item" href="/">Голосования</a>
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    вот
    PHP:
    1. route('tickets.index')
    как у вас прописан?
    делаете еще, например tickets.index.polls
     
  7. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    А если контроллер общий, а не для каждого метода отдельно?
    PHP:
    1. Route::resource('tickets', 'TicketController');
     
  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    mkramer нравится это.
  9. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    О, так вы связи прописали.... Вообще, если вы связи прописали, надо поменьше джоинить, особенно в случае с laravel... Он сам всё умеет, надо только прочитать документацию
    PHP:
    1. $tickets= Ticket::with("person")->get();
    2.  
    3. // И потом радостно пишем:
    4. echo $tikens[0]->person->name; // ну или не name, я не помню, какие там поля у вас
    В большинстве случаев будет достаточно... Мы же не просто так прописываем эти связи. А чтоб нам меньше писать sql. (вообще, смысл ORM в том, чтоб меньше писать SQL)

    Ну resource-контроллеры большей частью для админок. Или у вас и пользователь может свои билеты добавлять? А так, никто не мешает помимо resource прописать ещё роуты для специфических случаев.
     
  10. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    То есть это прямой аналог джоина? И потом в цикле также можно обращаться к полям связанной таблицы через ->?
     
  11. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Конечно можно :)
     
  12. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Два человека по-разному ответили и теперь вообще ничего непонятно.
    Имеется метод, отредактировал его для использования связей:
    PHP:
    1. public function index($type = null) {
    2.  
    3.     // если тип тикета голосование
    4.     if($type == 'vote') {
    5.         $tickets = Ticket::where('type', $type)->with('person')->get();
    6.     } else { //
    7.         $tickets = Ticket::with('person')->get();
    8.     }
    9.  
    10.     return view('tickets.index', compact('tickets'));
    11. }
    Вот маршрут:
    PHP:
    1. Route::get('/tickets/vote', function () {
    2.     return view('tickets.index');
    3. });
    Думаю, будет удобнее сделать вывод на этой же странице tickets.
    Где и что нужно поменять, чтобы реализовать такой вывод?
    --- Добавлено ---
    Кстати, вот какой момент еще хотел спросить. Я когда создавал модель Person с параметром -m, у меня создавалась миграция peoples. Я ее переименовал, таблица в базе называется persons. Но теперь пишет ошибку: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'gradwork.people' doesn't exist (SQL: select * from `people` where `people`.`id` in (1, 2))
    Я понял, что он не видит таблицу people, но я ведь везде все переименовал на persons. Где-то забыл, видимо? Но не понимаю где
     

    Вложения:

  13. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    @lordconst Ну потому что нифига не читаете. У вас есть документация, где русским языком всё написано. Прочитайте, как от имени модели образуется имя таблицы, и что сделать, если различается. И вообще, если Laravel что-то назвал сам, так и надо оставлять, чтоб потом не иметь проблем. Тут блин скоро пол руководства по Eloquent в топик перекочует.
     
  14. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    В итоге-то что делать теперь?
    Ну так если из документации не ясно как быть в моем случае? Это слишком абстрактно, а я новичок. Вот дать вам учебник по строительству и сказать: "построй дом". Сможете ровно фундамент сделать? А кладку кирпичей правильно сделать? Вот и я как начинающий не совсем пока понимаю как надо делать в моем случае.
    Тем более что люди по-разному понимают материал. Кому-то действительно хватает документации, а кому-то нужно показать на видео, кому-то лично объяснить.
    upd: вот цитирую документацию: "Если это имя не указано явно, то в соответствии с принятым соглашением будет использовано имя класса в нижнем регистре и во множественном числе". Person->persons, а какого черта он назвал peoples?
    upd2: добавил protected $table = 'persons'; и ошибки больше нет. Но по-прежнему остается открытым вопрос в топике
     
    #14 lordconst, 9 апр 2020
    Последнее редактирование: 9 апр 2020
  15. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Лол, вдобавок связь не работает. Просто не выводит на экран поле из связанной таблицы, хотя страница загружается успешно и без ошибок
     
  16. mkramer

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

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

    А когда я за людей что-то делаю, мне платят деньги....
     
  17. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    вот и я строю будки сейчас
     
  18. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    А если добавить свой метод, не связанный с crud, в контроллер?
    Попробовал сделать так:
    PHP:
    1. public function getVote() {
    2.  
    3.         $votes = Ticket::all();
    4.  
    5.         return view('tickets.vote', compact('votes'));
    6.     }
    А на странице пишет, что метод show не существует. Адресная строка tickets/vote
    Можно ли как-то указать, что я и не собираюсь использовать сейчас show, а свой кастомный метод?