dima9595
@dima9595
Junior PHP

Как получить авторов (пользователей) с использованием нетерпеливой ленивой загрузкой?

Делаю что-то типо соц. сети. Страница профиля. Получаю посты пользователя. Необходимо получить ещё авторов постов, если таковые и есть. Но не знаю как сделать(

Модель User:
/* Получаем данные по пользователю */
	public static function getUser(string $login = null){
		return User::where('login_users', $login)->first();
	}

	/* Получаем все зависимости */
	public static function withUser(string $login){
		$user = User::getUser($login);   // Получаем данные о пользователе

		// "Делаем ленивую нетерпеливую загрузку"
		if($user){
			$user->load(['posts']);
		}

		return $user;    // Отдаём эти данные
	}

	/* Получаем все посты от пользователя */
	public function posts(){
		return $this->hasMany(Posts::class, 'user_posts', 'id_users');
	}

	/* Получаем всех авторов постов (не так получается) */
	public function authorPosts(){
		return $this->hasMany(Posts::class, 'userAdd_posts', 'id_users');
	}


С этого кода выводится данные самого пользователя и посты с его страницы. Но теперь нужно получить ещё авторов по userAdd_posts (таблица posts). Как это сделать?

Таблица постов
59eefabd4ca6a341873049.png
Таблица пользователей
59eefafa8d9eb204485690.png


Уже не знаю что делать. Заранее спасибо.

PS: Может такой пример лучше будет: Соц. сеть. Страница пользователя. У пользователя есть посты. Они могут быть от разных пользователей. Мне нужно получить все посты (с данные об авторах), которые находятся у этого пользователя (берутся по условию, допустим, 'author_posts' == $id_user). Далее, как только получены все эти данные, то нужно будет ещё подгружать "лайки" и "репосты" (пока ещё к реализации этого не дошёл из-за непонятности как это сделать), точнее - количество.
  • Вопрос задан
  • 225 просмотров
Решения вопроса 2
ellrion
@ellrion
зачем вы добавляете "шума" в модель? чем ваш статик метод getUser который будет вызываться как
User::getUser($login) лучше чем User::whereLogin($login)->first()? Я бы еще понял будь этот метод getByLogin в UsersRepository. статик метод withUser вообще бред - User::withUser($login) - ват?
Нейминг полей заставил меня плакать.
Зачем делать жадноленивую загруку для одного объекта?

Ну и главное в вашем вопросе нет вопроса.
Ответ написан
dima9595
@dima9595 Автор вопроса
Junior PHP
Хехехехе...нашёл решение проблемы магическим образом, выложу код здесь. Благодарю всех, кто помогал, особенно ellrion, который предоставил хороший код для дальнейшего редактирования!

Модель User:
/* Получаем все зависимости */
	public static function withUser(string $login){
		$user = User::where('login_users', $login)->first();   // Получаем данные о пользователе
		$user->load(['getUserPosts.author']);

		return $user;    // Отдаём эти данные
	}

	/* Получаем все посты со страницы пользователя */
	public function getUserPosts(){
		return $this->hasMany(Posts::class, 'user_posts', 'id_users');
	}


Модель Posts:
/* Получаем авторов поста */
	public function author(){
		return $this->belongsTo(User::class, 'author_posts', 'id_users');
	}


Ну и сам контроллер (нет ни чего магического):
$withUser = User::withUser($login);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@bagzon
Backend PHP, NodeJs, JS
Когда участвует такое кол-во данных и связей, лучше переделать на чистые запросы mysql, иначе потечет да и в целом будет тормозить на больших данных
Ответ написан
@anlamas
Кажется ты хотел создать а-ля "посты в закладке" для пользователя?
Для этого создай третью таблицу. В итоге у тебя три таблицы.
users: id name login email ...
posts: id title body slug author_id
users_posts: user_id post_id // посты в закладках

RouteServiceProvider.php
public function boot()
{
    parent::boot();

    Route::model('user', App\User::class);
    Route::model('post', App\Post::class);
}


web.php
Route::get('profile/{user}', 'UserController@show')
Route::get('posts/{post}', 'PostController@show')

User.php
public function getRouteKeyName()
{
    return 'login';
}

public function posts_feed()
{
    return $this->belongsToMany('App\Post');
}

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


Post.php
public function getRouteKeyName()
{
    return 'slug';
}

public function author()
{
    return $this->belongsTo('App\User');
}


class ProfileController extends Controller
{
    public function show(User $user)
    {
        $user->load('posts_feed.author')
        return view('profile', compact('user'))
    }
}

В show.blade.php
{{ $user->name }}
@foreach(user->posts_feed as $post)
    {{ $post->title }}
    {{ $post->author->name }}
@endforeach
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы