Имеется страница с навигацией, один из элементов - выпадающее меню. Кнопки Все тикеты, Голосования и Объявления. Удалось сделать вывод вообще всех строк, как раз страница Все тикеты. Но как вывести на отдельные страницы только те тикеты, что соответствуют названию? В базе данных есть поле type, принимает значения Объявление или Голосование. PHP: class TicketController extends Controller { public function index() { $tickets = Ticket::join('persons', 'person_id', '=', 'persons.id')->get(); return view('tickets.index', compact('tickets')); } }
Есть такая штука в SQL, where называется. И о чудо, в ларавель оно тоже есть.... Ты опять нарываешься на перезапись id при джоине, кстати...
Про where я знаю, я имел ввиду как нужно один и тот же метод index использовать в разных страницах с разными условиями (в моем случае по полю type). Перезапись? Чем это чревато и как правильно тогда соединять таблицы? В этот раз я прописал связи в моделях, так как их использовать именно на связь с таблицами? Допустим, вот связь модели Ticket и модели Person: PHP: class Ticket extends Model { public function person() { return $this->belongsTo('App\Person'); } public function result_ticket() { return $this->hasOne('App\ResultTicket'); } public function comment() { return $this->hasMany('App\Comment'); } }
не не знаю чего вы там накодили но смысл примерно такой PHP: public function index($slug = null) { if ($slug) { // конкретного типа $tickets = Ticket::where('type',$slug)->join('persons', 'person_id', '=', 'persons.id')->get(); } else { // все подряд $tickets = Ticket::join('persons', 'person_id', '=', 'persons.id')->get(); } ну и маршруты разные для разных пунктов - а там вызов контроллера - либо с параметром. либо без }
спасибо, а в ссылки как это прописать? Вот с Все тикеты понятно как, а остальные как параметр передать? HTML: <a class="dropdown-item" href="{{ route('tickets.index') }}">Все тикеты</a> <a class="dropdown-item" href="/">Объявления</a> <a class="dropdown-item" href="/">Голосования</a>
А если контроллер общий, а не для каждого метода отдельно? PHP: Route::resource('tickets', 'TicketController');
а не пойти ли вам? на сайт с документацией Ларавела, и получить простые отпеты на простые вопросы? например на https://laravel.ru/docs/v5/routing#необязательные
О, так вы связи прописали.... Вообще, если вы связи прописали, надо поменьше джоинить, особенно в случае с laravel... Он сам всё умеет, надо только прочитать документацию PHP: $tickets= Ticket::with("person")->get(); // И потом радостно пишем: echo $tikens[0]->person->name; // ну или не name, я не помню, какие там поля у вас В большинстве случаев будет достаточно... Мы же не просто так прописываем эти связи. А чтоб нам меньше писать sql. (вообще, смысл ORM в том, чтоб меньше писать SQL) Ну resource-контроллеры большей частью для админок. Или у вас и пользователь может свои билеты добавлять? А так, никто не мешает помимо resource прописать ещё роуты для специфических случаев.
То есть это прямой аналог джоина? И потом в цикле также можно обращаться к полям связанной таблицы через ->?
Два человека по-разному ответили и теперь вообще ничего непонятно. Имеется метод, отредактировал его для использования связей: PHP: public function index($type = null) { // если тип тикета голосование if($type == 'vote') { $tickets = Ticket::where('type', $type)->with('person')->get(); } else { // $tickets = Ticket::with('person')->get(); } return view('tickets.index', compact('tickets')); } Вот маршрут: PHP: Route::get('/tickets/vote', function () { return view('tickets.index'); }); Думаю, будет удобнее сделать вывод на этой же странице 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. Где-то забыл, видимо? Но не понимаю где
@lordconst Ну потому что нифига не читаете. У вас есть документация, где русским языком всё написано. Прочитайте, как от имени модели образуется имя таблицы, и что сделать, если различается. И вообще, если Laravel что-то назвал сам, так и надо оставлять, чтоб потом не иметь проблем. Тут блин скоро пол руководства по Eloquent в топик перекочует.
В итоге-то что делать теперь? Ну так если из документации не ясно как быть в моем случае? Это слишком абстрактно, а я новичок. Вот дать вам учебник по строительству и сказать: "построй дом". Сможете ровно фундамент сделать? А кладку кирпичей правильно сделать? Вот и я как начинающий не совсем пока понимаю как надо делать в моем случае. Тем более что люди по-разному понимают материал. Кому-то действительно хватает документации, а кому-то нужно показать на видео, кому-то лично объяснить. upd: вот цитирую документацию: "Если это имя не указано явно, то в соответствии с принятым соглашением будет использовано имя класса в нижнем регистре и во множественном числе". Person->persons, а какого черта он назвал peoples? upd2: добавил protected $table = 'persons'; и ошибки больше нет. Но по-прежнему остается открытым вопрос в топике
Лол, вдобавок связь не работает. Просто не выводит на экран поле из связанной таблицы, хотя страница загружается успешно и без ошибок
Не полезу строить дом, не сколотив с десяток собачьих будок )) А когда я за людей что-то делаю, мне платят деньги....
А если добавить свой метод, не связанный с crud, в контроллер? Попробовал сделать так: PHP: public function getVote() { $votes = Ticket::all(); return view('tickets.vote', compact('votes')); } А на странице пишет, что метод show не существует. Адресная строка tickets/vote Можно ли как-то указать, что я и не собираюсь использовать сейчас show, а свой кастомный метод?