Заказ по дате активности вместо пользователей, за которыми следуют


Заказ по дате активности вместо пользователей, за которыми следуют

22.10.2020 11:24:36 Просмотров 11 Источник

У меня есть две таблицы: таблица действий и таблица последующих действий. Я хочу получить "следующее" действие в дату его создания, а не в дату создания пользователя.

    Schema::create('activities', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->integer('user_id')->index();
        $table->integer('activity_id')->index();
        $table->string('activity_type', 50);
        $table->timestamps();
        $table->index(['activity_id', 'activity_type']);
    });

    Schema::create('followings', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->integer('user_id');
        $table->unsignedBigInteger('follower_id');
        $table->dateTime('followed_date')->nullable();
        $table->dateTime('unfollowed_date')->nullable();
        $table->timestamps();
        $table->unique(['user_id', 'follower_id']);
    });

Прямо сейчас у меня есть этот код:

Контроллер:

$followings = $user->following()->get();

Смотреть:

@foreach($followings->sortByDesc('id') as $following)

                        @foreach($following->user->activity->sortByDesc('id') as $activity)
                        
                        @if($activity->activity_type == 'App\Thread')
                        <li class="activity">
                            <div class="activity-user">
                                <p class="avatar" style="background-color: {{ $activity->user->color }}">
                                    {{ substr($activity->user->name, 0, 1) }}</p>
                            </div>
                            <div class="activity-body">
                                <h4><a
                                        href="/profiles/{{ $activity->user->name }}?profile-posts">{{ $activity->user->name }}</a>
                                    published <a
                                        href="/forums/{{ $activity->activity->channel->slug }}/{{ $activity->activity->slug }}/">
                                        {{ $activity->activity->title }}</a></h4>
                                <p>
                                    {!! BBCode::parse($activity->activity->body) !!}
                                </p>
                                <p class="created-at">
                                    {{-- {{ $activity->activity->created_at->format('l') }}
                                    at
                                    {{ $activity->activity->created_at->format('h:i A') }} --}}
                                    {{ $activity->activity->created_at->format('M j, Y') }}
                                </p>
                            </div>
                        </li>

                        @endif
                        @endforeach

                        @endforeach

Модель:

public function following()
{
    return $this->hasMany(Following::class);
}

Есть ли в любом случае для меня, чтобы добраться до полиморфной таблицы и заказать по дате активности, а не по следующей дате ()?

Прямо сейчас он возвращает записи, основанные на имени пользователя в дату его публикации, но я бы хотел, чтобы это было строго по активности.

У вопроса есть решение - Посмотреть?

Ответы - Заказ по дате активности вместо пользователей, за которыми следуют / Order by activity date instead of users followed

Metabolic

22.10.2020 11:33:16

Для вашего сценария вам будет лучше использовать пользовательский запрос DB, подобный этому, я еще не тестировал его, поэтому вам нужно будет настроить его для вашего варианта использования, но основная концепция Laravel почти такая же.

$following = Following::join('users', 'followings.user_id', '=','users.id')
        ->join('activites', 'users.id', '=', 'activities.user_id')
        ->orderBy('activities.created_at')
        ->select('followings.*')
        ->get();
Является ответом!
user123

23.10.2020 04:52:11

Вот как я это сделал:

Контроллер

    $followings = $user->following()->get();
    foreach($followings as $following) {
        foreach($following->user->activity as $activity) {
            $followingArray[] = $activity->id;
        }
    }
    //dd($followingArray);
    if(!empty($followingArray)){
        $following = Activity::whereIn('id', $followingArray)->orderBy('created_at', 'desc')->get();
    } else {
        $following = '';
    }

Смотреть:

                    @if(!empty($following))

                    @foreach($following as $activity)
Помочь в развитии проекта:
Закрыть X