Загрузка вложенных отношений с использованием морфических отношений в laravel v5.8 - PullRequest
0 голосов
/ 11 марта 2019

Привет, я работаю в Laravel v5.7. Морфические отношения. Теперь я застрял в том, как я могу выбрать выбранные отношения модели postable_type.

private static function getHomeQuery($user_id) {
        $query = PostBox::distinct("user_posts_id")->select("user_posts_id")
                ->where(function($sql) {
                    $sql->where('archive', '=', false);
                    $sql->where('status', '=', 'A');
                })
                ->whereHas('post', function($sql) {
                    $sql->where('postable_type', 'media');
                })
                ->with(["post" => function($sql) use($user_id) {
                $columns = ["id", "text_content", "created_at",
                    "local_db_path", "user_id", "post_type_id", "web_url",
                    "location_id", "short_code", \DB::raw("id as postable_id,postable_type")];
                $sql->select($columns);
                $sql->with(['user' => function($sql) {
                        $sql->select('id', "uid", 'username', 'picture', 'bucket', 'is_live');
                    }, 'postable', 'postLikesByUser' => function($sql) use ($user_id) {
                        $sql->select('id', 'liked_to');
                        $sql->where("liked_by", "=", $user_id);
                    }]);
            }]);
        return $query;
    }

это мой запрос, который мне нужно изменить. связь с почтой - моя морфическая модель и работает хорошо. Когда я запускаю этот запрос, этот запрос возвращает текущую запись таблицы и запись морфической таблицы. Но в морфической таблице у меня есть модель post_media, которая содержит как минимум 10 дальнейших отношений. Теперь я хочу выбрать только три отношения с этим выполнением запроса. Belo Моя модель PostMedia, из которой я хочу выбрать только выбранные отношения.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class MediaPost extends Model {

    protected $primarykey = 'id';

    protected $table = 'media_posts';

    protected $with = ["postMedia"];

    protected $fillable = [
        'id', 'post_type_id', 'user_id', 'archive', 'created_at', 'updated_at'
    ];
    protected $appends = ["require_full"];

    public function post() {
        return $this->morphToMany('App\Models\UserPost', 'postable', 'id');
    }

    public function getRequireFullAttribute() {
        return $this->attributes;
    }

    public function postMedia() {
        return $this->hasMany('App\Models\PostMedia', 'user_post_id', 'id');
    }

    public function latestPostMedia() {
        return $this->hasOne('App\Models\PostMedia', 'user_post_id', 'id')->orderBy("id", "ASC");
    }

    public function postBoxes() {
        return $this->hasMany('App\Models\PostBox', 'user_posts_id', 'id');
    }

    public function place() {
        return $this->hasOne('App\Models\Location', 'id', 'location_id');
    }

    public function postLocation() {
        return $this->hasOne('App\Models\PostLocation', 'user_post_id', 'id');
    }

    public function postBoxesPivot() {
        return $this->belongsToMany('App\Models\Box', 'user_posts_boxes', 'user_posts_id', 'box_id');
    }

    public function postTagsPivot() {
        return $this->belongsToMany('App\Models\User', 'post_tag_users', 'user_post_id', 'user_id');
    }

    public function postTotalLikes() {
        return $this->hasOne('App\Models\Like', 'liked_to', 'id')
                        ->selectRaw('liked_to,count(*) as total_likes ')
                        ->groupBy('liked_to');
    }

    public function postTotalTags() {
        return $this->hasOne('App\Models\PostTagUser', 'user_post_id', 'id')
                        ->selectRaw('user_post_id,count(*) as total_tags ')
                        ->groupBy('user_post_id');
    }

    public function postTotalComments() {
        return $this->hasOne('App\Models\PostComment', 'user_post_id', 'id')->where(function($sql) {
//                            $sql->where('archive', '=', false);
                        })->selectRaw('user_post_id,count(*)  as total_comments ')
                        ->groupBy('user_post_id');
    }


}

Из приведенной выше модели я просто хочу выбрать только четыре отношения: имя postMedia, место, postBoxes и местоположение. я не знаю, как мне достичь этой цели, даже не найдя полезного решения, которое я нашел в поиске Google.

...