Laravel Как получить все данные из связанных таблиц при many-to-many?

berkut

Новичок
В целом:
PHP:
class Task extends Model
{
    public function tags()
    {
        return $this->belongsToMany(Tag::class, 'task_tag');
    }
}
PHP:
class Tag extends Model
{
    public function tasks()
    {
        return $this->belongsToMany(Task::class, 'task_tag');
    }
}
Хочу получить все Task с прилепленными к ним Tag.

PHP:
$task = new Task();
//return $task->all()->load(Tag::class); // Не работает

return $task->all()->load('tags'); // Работает
Я считаю, указывать название таблицы в качестве строки == зло, как и классов, т.к. IDE не подсвечивает.
Как реализовать
$task->all()->load('tags');
Но с указанием класса, типа >load(Tag::class) ???
 

WMix

герр M:)ller
Партнер клуба
странное желание, маппить класс на метод.

что-то такое
PHP:
class Task extends Model{

    private $map = [Tag::class => 'tags'];
   
    function loadAll($class){
      return $this->all()->load($this->map[$class]);
    }

    public function tags(){
        return $this->belongsToMany(Tag::class, 'task_tag');
    }
}
$task->loadAll(Tag::class)
 

berkut

Новичок
@WMix, Как-то странно. Те же яйца, вид сбоку. Неужели нет способа подгрузить все/заданную связку без костылей с указанием таблицы?

upd: Может я плохо описал задачу. Я просто хочу получить в контроллере все данные, связанные с Task, одним запросом к бд.
 
Последнее редактирование:

флоппик

promotor fidei
Команда форума
Партнер клуба
upd: Может я плохо описал задачу. Я просто хочу получить в контроллере все данные, связанные с Task, одним запросом к бд.
PHP:
Task::with(['tags'])->all();
?
Там правда, вроде все равно 2 запроса будет.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
А, понял.
Я считаю, указывать название таблицы в качестве строки == зло, как и классов, т.к. IDE не подсвечивает.
А это не название таблицы. Это название твоего метода с релейшном. На самом деле это в целом похер, потому что константа ::class это не какое-то магическое поведение, а натурально, просто автоматически создаваемая строка.
Можешь сам маппинг с константой сделать, да и использовать его, если уж так хочется прям.
 

WMix

герр M:)ller
Партнер клуба
@berkut, задача изначально неправильная,
одна сущность может иметь ссылки на несколько одинаковых по типу сущностей, к примеру папа это человек и мама тоже. как потом разделять?
конечно можно каждое описание связи вырезать в отдельный класс и после использовать.

PHP:
class TaskTagsRelationResolver implements RelationResolver{
  private $tasks;
  public function resolve(){
    return $this->tasks->belongsToMany(Tag::class, 'task_tag');
  }
}
вопрос только нафига?
 
Сверху