مهدی
4 سال پیش توسط مهدی مطرح شد
10 پاسخ

مشکل در api لاراول

سلام
من یک api با استفاده از passport روی لاراول پیاده سازی کردم، با استفاده از oauth/token میام و کاربرم رو لاگین میکنم، بعد یک route دارم شبیه به کد زیر:

Route::get('/getProfile', 'AuthController@profile')->middleware('auth:api');

و متد مربوطه به این route:

public function profile(){
        $userProfile = auth('api')->user()->with('meta')->get();
        return response()->json(['message' => $userProfile]);
    }

طبیعتا این کد باید صرفا کاربر جاری که با استفاده از api و به روش فوق لاگین کرده رو نمایش بده اما میاد و کل کاربران رو واسم نمایش میده

نمیدونم چرا چنین اتفاقی افتاده، واسم منطقی نیست، کسی میتونه کمکی بده؟

@ali.bayat


ثبت پرسش جدید
علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
0

@mrmmg

مشکل که نیست.. این تفاوت عملکرد بین این ۲ متد هست

روابط در مدل های الکوئنت، در پشت صحنه از Join های بین جداول استفاده میکنند
نوع فراخوانی داده ها در متد های with و load با هم فرق میکنه
که این تفاوت باعث میشه نوع کوئری های متفاوتی ساخته و اجرا بشه


من جداول شما رو ندارم اما با رابطه بین User و Roles برات مثال میزنم:
اگر من بیام یه User رو پیدا کنم و با With بخواهم رابطه Roles رو بگیرم
یعنی چنین حالتی:

User::find(4)->with('roles')->get()

کوئری هایی که تولید میشند به شکل زیره:


"select * from `users` where `users`.`id` = 4 limit 1";

"select * from `users`";

"select `roles`.*, `model_has_roles`.`model_id` as `pivot_model_id`, `model_has_roles`.`role_id` as `pivot_role_id`, `model_has_roles`.`model_type` as `pivot_model_type` from `roles` inner join `model_has_roles` on `roles`.`id` = `model_has_roles`.`role_id` where `model_has_roles`.`model_id` in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) and `model_has_roles`.`model_type` = `App\User`"

من توی سیستمم کلا ۱۲ تا User دارم و میبینی که توی کوئری سوم داره whereIn روی هر ۱۲ تا کاربر زده میشه..
همچنین توی کوئری دوم هم داره تمام کاربرا رو میگیره
برای همین هم تمام کاربر ها رو برمیگردونه


حالا اگر از Load استفاده کنم:

User::find(4)->load('roles')

کوئری هایی که تولید میشند به شکل زیره:


"select count(*) as aggregate from `users`";

"select * from `users` where `users`.`id` = 4 limit 1";

"select `roles`.*, `model_has_roles`.`model_id` as `pivot_model_id`, `model_has_roles`.`role_id` as `pivot_role_id`, `model_has_roles`.`model_type` as `pivot_model_type` from `roles` inner join `model_has_roles` on `roles`.`id` = `model_has_roles`.`role_id` where `model_has_roles`.`model_id` in (4) and `model_has_roles`.`model_type` = `App\User`";

اما این بار فقط یک آی‌‌دی توی whereIn داریم

با توجه به نوع کوئری هایی که اجرا میشه، چنین نتیجه ای کاملا منطقی هست


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
1

احتمالا به علت استفاده از متد with هست
به جاش از load استفاده کن
باید مشکل حل بشه


مهدی
تخصص : برنامه نویس و طراح وب
@mrmmg 4 سال پیش مطرح شد
0

@ali.bayat
کلا اون قسمت with رو هم پاک کردم و به توصیه شما از load هم استفاده کردم ولی تاثیری نداشت و نتیجه به طرز عجیبی یکسانه!

$userProfile = auth('api')->user()->get();

بدون رابطه هم بازم کل کاربران رو برمیگردونه

نسخه لاراول 7.30 هست، میتونه مشکل از لاراول باشه؟


Majid Goudarzi
تخصص : برنامه نویس
@masterspyware 4 سال پیش مطرح شد
0

لطفا midleware روتر api رو مجددا بررسی کنید.
اگر مشکلی نداشت میتونید مقدار count کاربر تونو بگیرید.
اگر همه رو حساب کرد یعنی یا توو دیتابیس یا توو شرطتون ی باگ داره


مهدی
تخصص : برنامه نویس و طراح وب
@mrmmg 4 سال پیش مطرح شد
0

@masterspyware
اینکارهارو به جز بررسی میدلور انجام دادم و در هر صورت تمام کاربران رو برمیگردونه
شرط خاصی هم اعمال نکردم! نمونه کدش رو بالا فرستادم

مگر اینکه پاسپورت روشی برای احراز هویت کاربر ارائه بده که من نمیشناسمش و گرنه همین شرایط با میدولور auth که guard پیشفرض web روش اعمال میشه نتیجه صحیح هست


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
0

من با نسخه 7.28 لاراول همچین مشکلی ندارم
بعید میدونم از نسخه لاراول باشه.

اگر فقط کاربر رو برگردونی، باز هم همین مشکل هست؟

$user = auth('api')->user()

مهدی
تخصص : برنامه نویس و طراح وب
@mrmmg 4 سال پیش مطرح شد
0

@ali.bayat
دقیقا این مورد رو انجام دادم و مشکلی حل شد، در واقعی هنگامی که رابطه رو درخواست میدم گیج میشه
شما دلیلش رو میدونید؟


مهدی
تخصص : برنامه نویس و طراح وب
@mrmmg 4 سال پیش مطرح شد
0

@ali.bayat
به طور اتفاقی اومدم و از load استفاده کردم به جای with و مشکل حل شد

$userProfile = auth('api')->user()->load('meta');

درسته مشکل حل شده ولی هنوزم واسم سواله چرا باید برای لاراول این مشکل عجیب به وجود بیاد


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
0

@mrmmg

مشکل که نیست.. این تفاوت عملکرد بین این ۲ متد هست

روابط در مدل های الکوئنت، در پشت صحنه از Join های بین جداول استفاده میکنند
نوع فراخوانی داده ها در متد های with و load با هم فرق میکنه
که این تفاوت باعث میشه نوع کوئری های متفاوتی ساخته و اجرا بشه


من جداول شما رو ندارم اما با رابطه بین User و Roles برات مثال میزنم:
اگر من بیام یه User رو پیدا کنم و با With بخواهم رابطه Roles رو بگیرم
یعنی چنین حالتی:

User::find(4)->with('roles')->get()

کوئری هایی که تولید میشند به شکل زیره:


"select * from `users` where `users`.`id` = 4 limit 1";

"select * from `users`";

"select `roles`.*, `model_has_roles`.`model_id` as `pivot_model_id`, `model_has_roles`.`role_id` as `pivot_role_id`, `model_has_roles`.`model_type` as `pivot_model_type` from `roles` inner join `model_has_roles` on `roles`.`id` = `model_has_roles`.`role_id` where `model_has_roles`.`model_id` in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) and `model_has_roles`.`model_type` = `App\User`"

من توی سیستمم کلا ۱۲ تا User دارم و میبینی که توی کوئری سوم داره whereIn روی هر ۱۲ تا کاربر زده میشه..
همچنین توی کوئری دوم هم داره تمام کاربرا رو میگیره
برای همین هم تمام کاربر ها رو برمیگردونه


حالا اگر از Load استفاده کنم:

User::find(4)->load('roles')

کوئری هایی که تولید میشند به شکل زیره:


"select count(*) as aggregate from `users`";

"select * from `users` where `users`.`id` = 4 limit 1";

"select `roles`.*, `model_has_roles`.`model_id` as `pivot_model_id`, `model_has_roles`.`role_id` as `pivot_role_id`, `model_has_roles`.`model_type` as `pivot_model_type` from `roles` inner join `model_has_roles` on `roles`.`id` = `model_has_roles`.`role_id` where `model_has_roles`.`model_id` in (4) and `model_has_roles`.`model_type` = `App\User`";

اما این بار فقط یک آی‌‌دی توی whereIn داریم

با توجه به نوع کوئری هایی که اجرا میشه، چنین نتیجه ای کاملا منطقی هست


مهدی
تخصص : برنامه نویس و طراح وب
@mrmmg 4 سال پیش مطرح شد
0

@ali.bayat واقعا مرسی از توضیحات خوبتون، لذت بردم


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
0

خواهش می‌کنم
موفق باشی


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام