Доступ к `последней` записи, хранящейся в таблице БД, сразу после записи - PullRequest
0 голосов
/ 06 октября 2019

В Laravel После записи последней строки в таблицу БД, могу ли я безопасно получить доступ к тем же записанным данным сразу после записи, вызвав latest() запросы? Поскольку транзакции других пользователей могут происходить в одно и то же время, и это может быть уже не последняя запись?

Редактировать:

Например:

Public function StoreNotif($data){

auth()->user()->Notif()->create(store $data here..)

}

Public function SendNotif(){

$data="123";

$this->StoreNotif($data)

event(new Notification(stored Notif instance?));

}

Ответы [ 2 ]

2 голосов
/ 06 октября 2019

Нет, вы не можете полагаться на базу данных для возврата записи из вашего текущего сценария.

Метод ->latest() всегда будет сортировать записи с самой последней created_at датой в первую очередь.
https://laravel.com/docs/6.x/queries#ordering-grouping-limit-and-offset

Но вы не предоставили ни кода, ни объяснения, почему это так. Если вы только что создали новую запись, зачем вам снова запрашивать ее? У вас уже должен быть доступ к экземпляру модели.

РЕДАКТИРОВАТЬ: Я сделал несколько правок, чтобы продемонстрировать, как вы будете передавать модель из контроллера в событие, как указано вкомментарии. Пожалуйста, оставьте свой код, если вам нужна более конкретная помощь.

SomeController.php

function store()
{
    $model = Model::create([
        'some_data' => 1 
    ]);

    // fire an event with the newly created model
    event(new SomeEvent($model));

    dd($model);
}

------------------------

Model {
    // ... 
    attributes: [
        'id' => 101,
        'some_data' => 1 
        'created_at' => '2019-10-06 12:48:01',
        'updated_at' => '2019-10-06 12:48:01',
    ]
    // ...
}

SomeEvent.php

<?php

namespace App\Events;

use App\Model;
use Illuminate\Queue\SerializesModels;

class SomeEvent
{
    use SerializesModels;

    public $model;

    public function __construct(Model $model)
    {
        $this->model = $model;

        // ...
    }
}

РЕДАКТИРОВАТЬ: В соответствии с вашим новым добавленным кодом, вам просто нужно передать новую модель обратно в исходный метод. Вы могли бы сделать что-то вроде этого.

Public function StoreNotif($data)
{
    // add a return statement
    return auth()->user()->Notif()->create(store $data here..);
}

Public function SendNotif()
{
    $data="123";

    // store the returned data to a variable
    $model = $this->StoreNotif($data);

    // call the event with the model instance
    event(new Notification(model));
}
0 голосов
/ 06 октября 2019

Я не уверен, что это «последний», но я знаю, что MySQL использует SELECT LAST_INSERT_ID в качестве запроса для получения идентификатора «per-connection» последнего вставленного элемента. Под обложками он использует mysql_insert_id, поэтому, если вы говорите на языке, который его поддерживает, вы также можете использовать это.

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