Заказ по дате активности вместо пользователей, за которыми следуют
У меня есть две таблицы: таблица действий и таблица последующих действий. Я хочу получить "следующее" действие в дату его создания, а не в дату создания пользователя.
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

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();

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)