То, что я пытаюсь сделать, это показать записи, которые были сохранены пользователем в профиле. Я попытаюсь объяснить это как можно лучше, ссылаясь на мой код. Так:
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.
Сообщение об ошибке 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());
Я понял, что у ПОЛЬЗОВАТЕЛЯ много 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.
}
}
Надеюсь, вы поймете поток, вы должны убедиться, что отношение моделей к нему отлично работает. Если вам нужна дополнительная помощь, сообщите мне.
$user = User::with(['posts', 'posts.article'])->where('id', $user_id)->first();
Call to a member function pluck() on array
$savedarticles = $authed->mysaves;