Изменить: это не работает должным образом. В отличие от принятого ответа, это приводит к уникальным нарушениям ключа, когда два процесса неоднократно называют upsert_foo
одновременно.
Eureka! Я понял способ сделать это в одном запросе: используйте UPDATE ... RETURNING
, чтобы проверить, были ли затронуты какие-либо строки:
CREATE TABLE foo (k INT PRIMARY KEY, v TEXT);
CREATE FUNCTION update_foo(k INT, v TEXT)
RETURNS SETOF INT AS $$
UPDATE foo SET v = $2 WHERE k = $1 RETURNING $1
$$ LANGUAGE sql;
CREATE FUNCTION upsert_foo(k INT, v TEXT)
RETURNS VOID AS $$
INSERT INTO foo
SELECT $1, $2
WHERE NOT EXISTS (SELECT update_foo($1, $2))
$$ LANGUAGE sql;
UPDATE
необходимо выполнить в отдельной процедуре, потому что, к сожалению, это синтаксическая ошибка:
... WHERE NOT EXISTS (UPDATE ...)
Теперь она работает по желанию:
SELECT upsert_foo(1, 'hi');
SELECT upsert_foo(1, 'bye');
SELECT upsert_foo(3, 'hi');
SELECT upsert_foo(3, 'bye');
В вашем методе просто проверьте, если пользователь вошел в систему, если затем прервать до 404, как показано ниже ...
if(\Illuminate\Support\Facades\Auth::check()) {
return abort(404);
}
#Rest of the code is for guest user.....
#