Postingan lainnya
laravel, duplicate email login via google
karena sebelumnya sudah registrasi manual pake email abcd@gmail.com, terus login via google pake akun dg email abcd@gmail.com 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()