Laravel получить последний ряд для пользователя в связанной модели - PullRequest
0 голосов
/ 12 октября 2018

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

AssignsTable

id|ticket_id |user_id |created_at 
1 |30        |1       |2018-10-12 10:17:42
2 |30        |2       |2018-10-12 11:17:51
3 |31        |1       |2018-10-12 11:18:00
4 |32        |3       |2018-10-12 12:18:00  
5 |33        |1       |2018-10-12 12:30:00    

Запрос

$tickets = Ticket::with('AssignedUsers')
           ->WhereHas('AssignedUsers', function($q) {
                $q->where('assigns.user_id', '=', '1')
                   ->latest('assigns.created_at')
                   ->groupBy('assigns.ticket_id')
                   ->orderBy('assigns.id');
             })
            ->get();

Результаты

id |ticket_id |user_id |created_at 
 1 |30        |1       |2018-10-12 10:17:42
 3 |31        |1       |2018-10-12 11:18:00
 5 |33        |1       |2018-10-12 12:30:00   

Ожидаемые результаты

id|ticket_id |user_id |created_at 
3 |31        |1       |2018-10-12 11:18:00   
5 |33        |1       |2018-10-12 12:30:00   

Как вы можете видеть вышеЯ хочу скрыть билет от пользователя 1 в случае, если он был назначен другому.

Ticket Modal

class Ticket extends Model
{
    public function AssignedUsers() 
    {
        return $this->belongsToMany(User::class, 'assigns','ticket_id','user_id')
        ->withTimestamps();
    }
}

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Во-первых: вы делаете ненужный дополнительный подзапрос

Во-вторых: попробуйте использовать с группой, я не запускал запрос, но я думаю, что он будет работать

$tickets = Ticket::with(['AssignedUsers' => function($q){
    $q->where('assigns.user_id', '=', '1')
       ->latest('assigns.created_at')
       ->groupBy('assigns.ticket_id')
       ->orderBy('assigns.id')
       ->havingRaw('count(assigns.ticket_id) <= 1');
    }])
    ->get();
0 голосов
/ 12 октября 2018

Спасибо всем за вашу помощь, я ценю ваши усилия.Я нашел решение, добавив поле статуса в таблицу назначений.

Еще раз спасибо

0 голосов
/ 12 октября 2018

Хорошо, если вы хотите получить все билеты, которые были назначены пользователю, вам нужно настроить отношения yout, такие как:

use App\Ticket;
use App\User;

class Ticket extends Model
{
    /**
     * There is no need to explicitly put the foreign keys 
     * in the relation if there are named as the model
     */
    public function users() 
    {
        return $this->belongsToMany(User::class, 'assigns')->withTimestamps()->withPivot(['id']);
    }
}

class User extends Model
{
    public function tickets() 
    {
        return $this->belongsToMany(Ticket::class, 'assigns')->withTimestamps()->withPivot(['id']);
    }
}

И получить доступ к свойству «tickets» в экземпляре модели User.получит все билеты, назначенные ему

$userTickets = User::find(1)->tickets; // will retrive ALL the records on 'AssignsTable' that have the field 'user_id' equals to 1

Если вы хотите получить все билеты пользователя :: find (1), ЗА ИСКЛЮЧЕНИЕМ первого билета (билет с идентификатором = 1), который вам нуженявно исключить идентификатор 1 в запросе так:

$allUserTicketsExceptTheTicketWithId1 = User::find(1)->tickets()->wherePivot('id', '!=', 1)->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...