Имеется задача, которую я уже решил с помощью сырого запроса с фасадом DB. Изначально пробовал сделать это через отношения, но в итоге из документации не понял как оно должно быть правильно. Просьба показать как это будет решено с помощью отношений. Прилагаю схему бд и свой код. Задача такова: при создании нового тикета, чтобы в поле person_id таблицы tickets прописывалось значение текущей персоны. Мой рабочий код: PHP: $person_id = DB::table('users') ->join('persons', 'persons.user_id', '=', 'users.id') ->where('users.id', '=', Auth::user()->id) ->value('persons.id'); А вот отношения м/у моделями: PHP: class Ticket extends Model { protected $dates = ['date_off']; public function person() { return $this->belongsTo('App\Person'); } } PHP: class Person extends Model { protected $table = 'persons'; public function user() { return $this->belongsTo('App\User'); } } p.s. просьба не тыкать в документацию, т.к. уже читал и пробовал сделать. p.p.s. да, я читал про связь через промежуточную таблицу, но не смог это реализовать в моем случае. p.p.p.s. дополнительно была мысль, чтобы при авторизации записывать в сессию значение person_id, но решил отказаться от нее.
Я тут. https://laravel.com/docs/7.x/eloquent-relationships#the-save-method C laravel не знаком, так что лучше уточни какая версия и ORM
Вроде бы последняя. Я копировал команды с документации. Спасибо, это не то, что нужно именно в этом вопросе, но тоже пригодится мне в этом проекте. Это сохранение данных в таблицу, а мне нужна выборка для вывода на экран У кого-нибудь еще есть мысли?
Так тут главная модель user, по логике запроса. А её ты и не показал --- Добавлено --- PHP: class User extends Authenticatable { public function person() { return $this->hasOne(Person::class); } } $person = Auth::user()->person; Не помню, тебе или нет я показывал, что Illuminate\Foundation\Auth\User, скрывающийся за Authenticatable, наследуется от Illuminate\Database\Eloquent\Model, соответственно, у него тоже есть все методы has*, belongsTo и т.п. --- Добавлено --- Вот тебе несколько фрагментов моего кода. У пользователя есть посты PHP: // В классе User, естественно public function posts() { return $this->hasMany(Post::class, "author_id"); } И вот я в контроллере получаю посты текущего пользователя PHP: public function my() { return $this->currentUser->posts()->returnedFirst()->with("author")->paginate(30); } returnedFirst - это такой scope у меня, чтоб посты, которые модератор вернул на доработку, возвращались первыми. with("author") ещё раз запрашивает, на самом деле, того же currentUser, но +/- один запрос не критично, зато удобно, не надо руками подставлять currentUser
Спасибо, приму к сведению. Помог один человек, решение оказалось донельзя простым: PHP: $myTickets = User::with('person.tickets')->find(Auth::user()->id);
Auth::user() - это уже экземпляр модели User, можно просто написать, если ваша конструкция работает: PHP: Auth::user()->person->tickets Не нужно ещё раз пользователя искать. Кстати, в твоём коде ты не билеты получаешь, а скорее, пользователя с его билетами. With больше нужен для запросов, когда больше одного экземпляра модели со связями нужно получить. В твоём случае от него по кол-ву запросов никакого выигрыша. Ну и стоит начинать уже соображать такие вещи из доки, это не что-то гениальное, это самые основы.