вызов laravel для неопределенного метода addEagerConstraints () - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть две модели

Post.php

id

post

show_id

type = 'movie'или' tv '

Show.php

id // идентификаторы только этого автоматического счетчика приращений
show_id

show_type =' movie 'или 'tv'

Дело в том, что шоу может быть либо ТВ, либо фильмом, и может иметь два одинаковых show_id, например, один телевизор может иметь show_id 10, а также один фильм может иметь его, но типыразличаются

у меня в пост-модели

public function show(){
      return $this->belongsTo('App\Show', 'show_id');
    }

в шоу-модели

public function post(){
  return $this->hasMany('App\Post', 'id');
}

эти отношения получают первое шоу с соответствующим идентификатором шоу, которое он видит, где егофильм или телевизор, я хочу ограничить его, чтобы он соответствовал столбцу типа с обеих сторон

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Я думаю, что вы ищете полиморфное отношение.Вместо того, чтобы иметь модель, которая может быть одним из двух «типов», вероятно, должны быть две отдельные модели в одном и том же отношении.Например:

class Post 
{
    public function Show() 
    {
        return $this->morphTo();
    }
 }

class TvShow
{
    public function Post() 
    {
        return $this->morphMany('App\Post', 'show');
    }
 }
class Movie
{
    public function Post() 
    {
        return $this->morphMany('App\Post', 'show');
    }
 }    

Тогда ваша таблица сообщений будет иметь поля show_id и show_type, которые будут относиться либо к телешоу, либо к фильму.Проверьте документы для получения дополнительной информации, я не уверен в остальной части вашего проекта, так что я не на 100% подойдет, но каждый раз, когда вы начинаете добавлять поля «_type» в вашу таблицу, вы должны задаться вопросом, следует ли вам это делатьиспользуя полиморфное отношение.Это также, вероятно, сделает ваши модели более чистыми и свободными от множества утверждений if, поскольку вы понимаете, что есть другие различия между фильмами и шоу и тем, как вы с ними справляетесь.

https://laravel.com/docs/5.7/eloquent-relationships#polymorphic-relations

0 голосов
/ 29 сентября 2018

Я только что натолкнулся на пакет https://github.com/topclaudy/compoships что он делает, он позволяет создавать отношения на основе более чем одного FK, который laravel не поддерживает по умолчанию

0 голосов
/ 27 сентября 2018

post.php:

public function show() {
    return $this->belongsTo('App\Show', 'show_id', 'show_id')
                ->where('type', $this->type);
}

show.php

public function posts() {
    return $this->hasMany('App\Post', 'show_id', 'show_id')
                ->where('type', $this->show_type);
}

ОБНОВЛЕНИЕ (код выше не работает!)

Попытка использовать, где предложения (как в примере ниже) не будут работать, когда стремятся загрузить отношения, потому что во время обработки отношения $this->f2 это null.

Чтениебольше здесь: Compoships

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...