Postingan lainnya
Buku Ini Koding!
Baru!
Buku ini akan jadi teman perjalanan kamu belajar sampai dapat kerjaan di dunia programming!
laravel, duplicate email login via google
karena sebelumnya sudah registrasi manual pake email [email protected], terus login via google pake akun dg email [email protected] otomatis duplicate, gimana ya caranya biar sekedar update ketika status email sudah ada didatabase dan insert ketika status masih kosong, khusus di laravel. mohon pencerahan
7 Jawaban:
Bisa pake method ->exists() yang ada di laravel untuk cek apakah ada data yang sesuai query-nya atau tidak, Contoh: <pre> if(User::where('email', $request->email)->exists()) { User::update([ //isi sendiri ]) } else { User::create([ //isi sendiri ]) } </pre>
Kang Hilman itu code saya bdw masih ada error, bisa mohon koreksi bantuannya kang <pre> class LoginController extends Controller { /* |-------------------------------------------------------------------------- | Login Controller |-------------------------------------------------------------------------- | | This controller handles authenticating users for the application and | redirecting them to your home screen. The controller uses a trait | to conveniently provide its functionality to your applications. | */
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/home';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this-&gt;middleware('guest')-&gt;except('logout');
}
public function redirectToProvider($provider)
{
return Socialite::driver($provider)-&gt;redirect();
}
public function handleProviderCallback($provider)
{
$user = Socialite::driver($provider)-&gt;stateless()-&gt;user();
$authUser = $this-&gt;findOrCreateUser($user, $provider);
Auth::login($authUser, true);
return redirect($this-&gt;redirectTo);
}
public function findOrCreateUser($user, $request)
{
// $authUser = User::where('provider_id',$user-&gt;id)-&gt;first();
// if ($authUser) {
// return $authUser;
// }
if(User::where('email', $request-&gt;email)-&gt;exists()) {
User::update([
'name' =&gt; $user-&gt;name,
'email' =&gt; $user-&gt;email,
'provider' =&gt; strtoupper($provider),
'provider_id' =&gt; $user-&gt;id
]);
}
else {
User::create([
'name' =&gt; $user-&gt;name,
'email' =&gt; $user-&gt;email,
'provider' =&gt; strtoupper($provider),
'provider_id' =&gt; $user-&gt;id
]);
}
// return User::create([
// 'name' =&gt; $user-&gt;name,
// 'email' =&gt; $user-&gt;email,
// 'provider' =&gt; strtoupper($provider),
// 'provider_id' =&gt; $user-&gt;id
// ]);
}
} </pre>
Error-nya apa? findOrCreateUser(Request $request) harusnya kalau emang ada parameter di urlnya findOrCreateUser(Request $request, $user)
ini update codenya masih error tapi, erronya tuh = ErrorException (E_DEPRECATED) Non-static method Illuminate\Database\Eloquent\Model::update() should not be called statically <pre> <?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\AuthenticatesUsers; use Socialite; use Auth; use App\User;
class LoginController extends Controller { /* |-------------------------------------------------------------------------- | Login Controller |-------------------------------------------------------------------------- | | This controller handles authenticating users for the application and | redirecting them to your home screen. The controller uses a trait | to conveniently provide its functionality to your applications. | */
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/home';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this-&gt;middleware('guest')-&gt;except('logout');
}
public function redirectToProvider($provider)
{
return Socialite::driver($provider)-&gt;redirect();
}
public function handleProviderCallback($provider)
{
$user = Socialite::driver($provider)-&gt;stateless()-&gt;user();
$authUser = $this-&gt;findOrCreateUser($user, $provider);
Auth::login($authUser, true);
return redirect($this-&gt;redirectTo);
}
public function findOrCreateUser($user, $provider)
{
// $authUser = User::where('provider_id',$user-&gt;id)-&gt;first();
// if ($authUser) {
// return $authUser;
// }
$authUser = User::where('email', $user-&gt;email)-&gt;exists();
if ($authUser) {
User::update([
'name' =&gt; $user-&gt;name,
'email' =&gt; $user-&gt;email,
'provider' =&gt; strtoupper($provider),
'provider_id' =&gt; $user-&gt;id
]);
$user-&gt;save();
}
else {
User::create([
'name' =&gt; $user-&gt;name,
'email' =&gt; $user-&gt;email,
'provider' =&gt; strtoupper($provider),
'provider_id' =&gt; $user-&gt;id
]);
}
// return User::create([
// 'name' =&gt; $user-&gt;name,
// 'email' =&gt; $user-&gt;email,
// 'provider' =&gt; strtoupper($provider),
// 'provider_id' =&gt; $user-&gt;id
// ]);
}
} </pre>
how ? mas hilman kalau udah cek bantu mas ya hehe stuck asli :D
Itu yang update ga spesifik mau update apa, kalau mau gini: <pre> $user = User::where('email', $user->email); if($user->exists()){ $user->update([ 'name' => $user->name, 'email' => $user->email, 'provider' => strtoupper($provider), 'provider_id' => $user->id ]) } </pre> *Kalau pakai ->update() ga usah pake ->save()