Как получить данные из отношения Laravel, не загружая их в исходную модель - PullRequest
2 голосов
/ 13 июля 2020

Я понимаю, что название может быть немного неясным, поэтому вот пример. Скажем, у меня есть пользователь и сообщение. У пользователя много сообщений. Как мне получить сообщения без добавления поля сообщений в модель пользователя.

EDIT:

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

$user = User::where('id', 1)->with('posts')

Что здесь происходит, так это то, что $user теперь имеет свойство под названием posts, которое содержит все сообщения, принадлежащие пользователю. Я не хочу этого. Я хочу сделать что-то вроде следующего:

$user = User::where('id', 1);
$posts = $user->posts;
return response(['user' => $user, 'posts' => $posts])

Проблема в том, что $user все еще имеет свойство posts. Я не хочу, чтобы это было.

ИЗМЕНИТЬ Под свойством posts я подразумеваю:

Перед вызовом $ user-> posts $user выглядит так:

['id' => 1, 'name' => 'jacob']

После вызова $user->posts

$user = ['id' => 1, 'name' => 'jacob', 'posts' => ['id' => 1, 'user_id' => 1]]

Мне нужен метод получения сообщений без изменения объекта $ user

Ответы [ 3 ]

2 голосов
/ 13 июля 2020

Изменить

Использовать laravel коллекцию забыть ()

$user = User::where('id', 1)->with('posts')->first();
$posts = $user->posts;
$user = collect($user)->forgot('posts')->all(); // this is what you must do. Be careful, this is now an array.
return response(['user' => $user, 'posts' => $posts]);

пользователи таблица

id  |  name
1   |  John
2   |  Adam

сообщения таблица

id  |  user_id  | title
1   |     1     | post_1
2   |     3     | post_2
3   |     1     | post_3

В этом случае у пользователя много сообщений. И сообщение принадлежит пользователю.

User :: class

public function posts() {
    return $this->hasMany(Post::class); // this will bind 'user_id' from the posts table to the 'id' of the users table
}

Post :: class

public function user() {
    return $this->belongsTo(User::class);
}

Затем вы можете просто получить доступ к сообщению пользователя через

@foreach($user->posts as $post)
    {{ $post->title }}
@endforeach
1 голос
/ 13 июля 2020

Для наиболее эффективного извлечения данных из базы данных и получения «плоских» массивов вы все равно должны использовать отношения для их извлечения, например:

$user = User::where('id', 1)->first();
$posts = $user->posts;
return response(['user' => $user->makeHidden('posts'), 'posts' => $posts])

Если вы не хотите использовать отношения почему-то

$user = User::where('id', 1)->first();
$posts = Post::where('user_id', $user->id)->get();
return response(['user' => $user, 'posts' => $posts])

0 голосов
/ 13 июля 2020

вы можете достичь этого, используя ресурсы

1-сначала создайте новый пользовательский ресурс:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class User extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            "user"=>[
              'id' => $this->id,
              'name' => $this->name,
              'email' => $this->email,  
              ],
            "posts"=>$this->posts
        ];
    }
}

2-в вашем контроллере:

 $users = User::with('posts')->get()
 return UserResource::collection($users);

laravel документ

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