Как взять 5 дочерних записей от родителя за один запрос? - PullRequest
0 голосов
/ 19 мая 2019

//Request

     $messages = ChatMessage::where('user_id', Auth::id())
            ->orderBy('created_at', 'asc')
            ->select(['chat_id'])
            ->take(5)
            ->distinct()
            ->with('chat.last_messages')
            ->get();

$messages = ChatMessage::where('user_id', Auth::id())
    ->orderBy('created_at', 'asc')
    ->select(['chat_id'])
    ->take(5)
    ->distinct()
    //->with('chat.last_messages')
    ->with(['chat'=>function($query) {
        $query->with(['last_messages'=>function($query) {
            $query->limit(5);
        }]);
    }])
    ->get();

//Class Message

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class ChatMessage extends Model
    {
        protected $fillable = ['chat_id','user_id', 'text'];
    
        public function user()
        {
            return $this->hasOne('App\Model\UserFieldsValues','id','user_id')/*->take(5)*/->select(['id','value']);
        }
    
        public function chat()
        {
            return $this->hasOne('App\Models\Chat','id','chat_id');
        }
    }

//Class Chat

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Chat extends Model
    {
        protected $fillable = ['name','id'];
    
        public function last_messages()
        {
            return $this->hasMany('App\Models\ChatMessage')->orderBy('created_at', 'asc')->limit(5);
        }
    
        public function unread_messages()
        {
            return $this->hasMany('App\Models\ChatMessage')->orderBy('created_at', 'asc')->where('read',0)->take(5);
        }
    }


///

Как взять 5 дочерних записей от родителя за один запрос?

На данный момент из базы данных взяты 5 сообщений для всех чатов, а не 5 для каждого.

И извините, вниз текст для подтверждения сообщения сайта .................................................. .................................................. ////////////////

1 Ответ

0 голосов
/ 19 мая 2019

В Laravel нет родной поддержки для этого.

Я создал для него пакет: https://github.com/staudenmeir/eloquent-eager-limit

Используйте черту HasEagerLimit как в родительской, так и в связанной модели.

class Chat extends Model {
    use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
}

class ChatMessage extends Model {
    use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
}

Тогда вы можете применить ->limit(5) / ->take(5) к вашим отношениям.

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