отношение вызова в функции доступа - PullRequest
0 голосов
/ 25 апреля 2019

Я хочу вызвать отношение в функции доступа с меньшим количеством запросов

тикет имеет много сообщений Модель билета имеет функцию доступа Я хочу в функции доступа , если ticket-> messages () -> Существовать () == TRUE возвращает тело сообщения s body, or ** if ticket->messages()->exist() == TRUE** returns ticket этот код строки ($ ticket-> last_body) делает один запрос для каждой строки, и я хочу уменьшить свой запрос

Модель билета :

class Ticket extends Model
{

    public function messages()
    {
        return $this->hasMany(TicketMessage::class, 'ticket_id');
    }

    public function getLastBodyAttribute()
    {

        if($this->messages()->exists()){
            return $this->messages()->orderByDesc('created_at')->first()->body;
        } else {
            return $this->body;
        }
    }
}

Билетный массаж принадлежит к билетам

Модель TicketMessage :

class TicketMessage extends Model
{
    public function ticket()
    {
        return $this->belongsTo(Ticket::class,'ticket_id');
    }
}

Я получаю билеты с собственными отношениями и перехожу на просмотр TicketController

class TicketController extends Controller
{
    public function index(Request $request)
    {
        $tickets = Ticket::with('messages')
                        ->where('status', 'open')
                        ->get();

        return view('ticket::supporter.supporter', compact('tickets'));
    }
}
this line code $ticket->last_body make one Query for each row and i want to decrease my query 

**supporter.blade** :

    @foreach($tickets as $ticket)
        <a href="{{url(Route('show_client_ticket', ['id' => $ticket->id]))}}">   
            {{$ticket->subject}} 
        </a>

        <p style="color: #959A9D;">
            {{$ticket->last_body}} //this line returns too much  Query
        </p>
        <hr>
    @endforeach

1 Ответ

0 голосов
/ 25 апреля 2019

Попробуйте изменить это.

 public function ticket()
    {
        return $this->belongsTo(Ticket::class,'ticket_id');
    }

на это.

 public function ticket()
    {
        return $this->belongsTo(Ticket::class,'id');
    }

, потому что первичным ключом модели по умолчанию является "id".

или еслиВы хотите изменить первичный ключ.попробуйте это:

class Ticket extends Model
 {
  protected $primaryKey = 'ticket_id';

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