Не выявлять отношения между классами с помощью Eloquent - PullRequest
0 голосов
/ 16 октября 2019

У меня есть 2 класса. Ссылки и информация должны быть связаны. Класс Info имеет Link_id, а ссылка имеет User_id.

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

Модель связи имеет:


    public function infos()
    {
        return $this->hasMany('info');

    }
}

Инфо-модель имеет:


    public function link()
    {
        return $this->belongsTo('link');
    }

Панель инструментов имеетконтроллер. Мне удалось получить все ссылки, выполнив поиск user_id

$linksByOwner = Link::where('user_id',$user_id)->get();

Теперь я пытаюсь найти информацию, расположенную в ссылке. Я попробовал это, используя:

    $collectedData = $linksByOwner->infos(); < Not working
    $collectedData = Info::where('link_id',19)->info(); < Not working

    dd($collectedData);

Это дало мне следующую ошибку:

Method Illuminate\Database\Eloquent\Collection::infos does not exist.

Некоторая дополнительная информация: обе модели имеют внешний ключ, связанный с ними при переносе базы данных

$table->foreign('user_id')
                ->references('id')->on('users')
                ->onDelete('cascade');
 $table->foreign('link_id')
                ->references('id')->on('links')
                ->onDelete('cascade');

Может кто-нибудь показать или сказать мне, как я могу это исправить? Это ошибка определения объема? Нужно ли соединять классы по-другому?

Ответы [ 3 ]

1 голос
/ 16 октября 2019

Вы можете pluck infos из имеющейся коллекции ссылок (при условии, что отношения установлены правильно):

$linksByOwner = Link::with('infos')->where('user_id', $user_id)->get();

$infos = $linksByOwner->pluck('infos');
0 голосов
/ 16 октября 2019

$linksByOwner - это Collection из Link моделей;Вы не можете получить доступ к отношениям (infos), если не выполните цикл по каждому из них.

$linksByOwner = Link::with(['infos'])->where('user_id',$user_id)->get();
foreach($linksByOwner AS $linkByOwner){
  $collectedData = $linkByOwner->infos; // Don't need the `()` here
  dd($collectedData); // Should be a `Collection` of `Info` models
}

Также обратите внимание, что return $this->belongsTo('link'); и return $this->hasMany('info'); link и info должны быть либо 'App\Link' / 'App\Info', App\Link::class / App\Info::class или, если вы импортируете Link и Info через use App\Link; и use App\Info;, то 'Link' / 'Info' или Link::class / Info::class.

Я не уверен, что 'link' и 'info' будут правильно ссылаться на вашу модель:

public function infos(){
  return $this->hasMany(App\Info::class);
}

public function link(){
  return $this->belongsTo(App\Link::class);
}
0 голосов
/ 16 октября 2019

Попробуйте изменить отношение Eloquent, указав, что это класс.

public function links(){
   return $this->hasMany(Link::class);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...