Попытка получить данные через связанную таблицу в Laravel

0

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

public function userProfil($id)

У меня есть функция профиля, которая получает данные из таблицы userprofile. и внутри у меня есть следующий код для сохраненных данных:

$authed = User::find($id);
$savedarticles = $authed->mysaves;
$allsavings = DB::select("Select * from article where id=$savedarticles->id");

Но этот код так не работает. Я могу сделать это вместо этого:

$authed = User::find($id);
$savedarticles = $authed->mysaves;

Но когда я пытаюсь получить статьи из таблицы статей со статьей_id из mysaves, это не работает, например:

$allsaved= DB::table('article')->where('id', $savedarticles->article_id);

ошибка, которую он дает, похожа:

Свойство [article_id] не существует в этом экземпляре коллекции.

хотя таблица savearticle имеет article_id я могу выводить ее без строки выше, и я вижу ее как:

@foreach($savedarticles as $savedarticle)
    <p>{{$savedarticle}}</p>
@endforeach

он дает мне все, что находится в таблице savearticle, и я могу получить savedarticle->article_id и получить article_id но не могу получить его в контроллере.

Я использую Laravel 5.4.

Теги:
laravel-5.4
relationship

2 ответа

1
Лучший ответ

Сообщение об ошибке Property [article_id] does not exist on this collection instance. означает, что вы пытаетесь получить атрибут одного экземпляра, но из коллекции.

Например, коллекция может быть похожа на

[$article1, $article2, $article3]

поэтому то, что вы пытались сделать, похоже на

[$article1, $article2, $article3]->article_id

Вы пытаетесь получить атрибут из коллекции вместо одного экземпляра.

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

$allsaved= DB::table('article')->whereIn('id', $savedarticles->pluck('article_id')->all());
  • 0
    Выдает ошибку Call to a member function pluck() on array
  • 0
    я не знаю, когда он стал массивом, но вы, вероятно, внесли изменения в свой код после $savedarticles = $authed->mysaves;
Показать ещё 2 комментария
0

Я понял, что у ПОЛЬЗОВАТЕЛЯ много POSTS, а POST принадлежит статье.

Если это так, то вам нужно сделать следующее.

1: В модели USER определите отношение для получения всех сообщений. как показано ниже.

public function posts() {
   // Foreign key will be a key that is stored in posts table and represent the user MAY BE: user_id
   $this->hasMany(Posts::class, 'foreign_key', 'local_key')
}

Это позволит вам получать все сообщения от пользователя.

2: В сообщениях модель определяет отношение пользователя, как показано ниже.

public function user() {
   $this->belongsTo(User::class, 'foreign_key', 'local_key');
}

Это позволит вам получить сообщение "Пользователь";

3: Теперь в вашем контроллере у вас будет что-то вроде этого.

public function show($user_id) {

      // find a user with posts as eager loading(to avoid query again)
      $user = User::with(['posts'])->where('id', $user_id)->first();

      // get all posts that belong to this user
      $posts = $user->posts; 
   }

В методе show show ($ user_id) у вас будут данные пользователя, а также данные пользовательских сообщений. Теперь, если вы хотите получить почтовые отношения, просто определите, как показано ниже. скажем, сообщение принадлежит и статье.

4: В сообщениях модель определяет отношение для получения статьи.

public function article() {
  // This will allow you to get a post artcle
  $this->belongsTo(Article::class, 'foreign_key', 'local_key');
}

Теперь вы можете получить статью, а также найти пользователя. см. ниже. Я переписываю действие шоу диспетчера, чтобы дать вам лучшее понимание.

5: Получить пользователя с user_id

public function show($user_id) {

// find a user with posts as eager loading(to avoid query again)
// eager loading for posts & post child, this will give you NOSQL at runtime and all data will come from one query. 
          $user = User::with(['posts', 'posts.article'])->where('id', $user_id)->first();

          // get all posts that belong to this user
          $posts = $user->posts; 
foreach($posts as $post) {
  $article = $post->article; // Child relation of post. 
}

   }

Надеюсь, вы поймете поток, вы должны убедиться, что отношение моделей к нему отлично работает. Если вам нужна дополнительная помощь, сообщите мне.

  • 0
    ну, это довольно близко к тому, что я пытался сказать, кроме. пользователь сохранял статьи, а не сообщения, а сохраненные статьи используются для хранения article_id и user_id. чем когда пользователь пытается просмотреть сохраненные статьи в своем профиле, мне нужно будет получить article_id из таблицы savearticle, где user_id - это идентификатор, который я отправляю, и чем я получу статьи из таблицы article, равной article_id, который есть в сохраненной статье. но логика, которую вы здесь сделали, будет работать в обе стороны, я постараюсь установить связь.
  • 0
    Я не понимаю, что именно эта строка должна делать $user = User::with(['posts', 'posts.article'])->where('id', $user_id)->first();
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню