راکت
مصطفی
مصطفی
توسط مصطفی مطرح شد
حل
5 پاسخ

خروجی تو در تو از eloquent query

سلام
من اومدم جداول terms وردپرس رو برای لاراول ایجاد کردم
جداول شامل :
posts
terms
termtaxonomy
termrelationship
تو مدل ها ارتباط چند به چند رو مشخص کردم و تو ذخیره اطلاعات مشکلی نیست
حالا می خوام یه کوئری بزنم همه پست ها رو بیاره خروجی می خوام یه آرایه تو در تو به این شکل بشه :

   [0] => Array
    (
        [Post] => Array
            (
                [id] => 1
                [title] => First article
                [content] => aaa
                [created] => 2008-05-18 00:00:00
            )
        [Tag] => Array
            (
                [0] => Array
                    (
                        [id] => 1
                        [name] => tag1
                    )
                [1] => Array
                    (
                        [id] => 2
                        [name] => tag2
                    )
            )
        [Category] =>  Array
            (
                [0] => Array
                    (
                        [id] => 1
                        [name] => cat1
                    )
                [1] => Array
                    (
                        [id] => 2
                        [name] => cat2
                    )   
    )
    [1] => Array
    (
        [Post] => Array
            (...    

تو mysql که کوئری رو تست می کنم خب بابت هر تعداد tag و category رکورد پست و تکرار می کنه تو این لینک https://stackoverflow.com/questions/11551061/how-to-get-nested-array-from-mysql-select-with-joins گفته بیا اول پست ها رو fetch کن بعد بیا با حلقه postid رو بفرست و کوئری های دیگه رو بزن و نتایج رو بریز تو یه آرایه دومی
حالا می خوام ببینم لاراول راه حل ساده تری نداره ؟ اگر با query builder یا راه حل بهتر دیگه ای هست ممنون می شم راهنمایی کنید


ثبت پرسش جدید
Mohammad Amin Mokhtari
Mohammad Amin Mokhtari
تخصص :برنامه نویس
@amin.mokhtari946 سال پیشمطرح شد
0

سلام اگر به درستی روابط چند به چند رو پیاده سازی کرده باشید به این صورت میتونید:

$res = array();
$posts = Post::all();
foreach ($posts as $post) {

    $postItem = array(
        ['id'] => $post->id,
        ['title'] => $post->title,
        ['content'] => $post->content,
        ['created'] => $post->created_at
    );
    $tagArray = array();
    foreach ($post->tag as $tag) {
        array_push($tagArray, [
            ['id'] => $tag->id,
            ['name'] => $tag->name
        ]);
    }
    $catArray = array();
    foreach ($post->categories as $cat) {
        array_push($catArray, [
            ['id'] => $cat->id,
            ['name'] => $cat->name
        ]);
    }

    $item = array(
        ['Post'] => $postItem,
        ['Tag']=>$tagArray,
        ['Category']=>$catArray
    );
    array_push($res,$item);
}
dd($res);

محسن بستان
محسن بستان
تخصص :Senior Backend Developer
@mohsenbostan6 سال پیشمطرح شد
0

@m.fartaj
سلام.
باید از ویژگی های Eloquent استفاده کنید. برای اینکه اون مقادیر رو هم هر بار نشون بدید بهتره که از Eager Loadingاستفاده کنید.
https://laravel.com/docs/7.x/eloquent-relationships#eager-loading


Mohammad Amin Mokhtari
Mohammad Amin Mokhtari
تخصص :برنامه نویس
@amin.mokhtari946 سال پیشمطرح شد
0

سلام اگر به درستی روابط چند به چند رو پیاده سازی کرده باشید به این صورت میتونید:

$res = array();
$posts = Post::all();
foreach ($posts as $post) {

    $postItem = array(
        ['id'] => $post->id,
        ['title'] => $post->title,
        ['content'] => $post->content,
        ['created'] => $post->created_at
    );
    $tagArray = array();
    foreach ($post->tag as $tag) {
        array_push($tagArray, [
            ['id'] => $tag->id,
            ['name'] => $tag->name
        ]);
    }
    $catArray = array();
    foreach ($post->categories as $cat) {
        array_push($catArray, [
            ['id'] => $cat->id,
            ['name'] => $cat->name
        ]);
    }

    $item = array(
        ['Post'] => $postItem,
        ['Tag']=>$tagArray,
        ['Category']=>$catArray
    );
    array_push($res,$item);
}
dd($res);

مصطفی
مصطفی
@m.fartaj6 سال پیشمطرح شد
0

@amin.mokhtari94
ممنون برای post به termrelationship جواب داد ولی چون خود post با tag و category ارتباط نداره و termrelationship با جدول مربوط ارتباط داره و جداولشون از هم جدا نیستن فقط با یک فیلد type از هم جدا می شن که از نوع tag هست یا category برای پیدا کردن دومی یک تابع برای جستجو زدم و اکی شد فقظ یک سوال برای تعداد بالای پست این کار درسته و eloquent پیشنهاد می شه ؟!
تصویر دیتا مدل وردپرس رو هم گذاشتم تا بهتر متوجه جداول بشید


Mohammad Amin Mokhtari
Mohammad Amin Mokhtari
تخصص :برنامه نویس
@amin.mokhtari946 سال پیشمطرح شد
0

وردپرس به دلایلی از قبیل کاستوم فیلد و قابلیت اینکه پلاگین ها یا کاربر بتونند برای خودشون انواع داده تعریف کنند اومده از termrelationship استفاده کرده، بهتره در سیستم لاراولی از این روش استفاده نکنید.
بله یکی از قابلیت های خوب لاراول Eloquent ORM هست، پیشنهاد میکنم حتما کار کنید باهاش.
موفق باشید


مصطفی
مصطفی
@m.fartaj6 سال پیشمطرح شد
0

@amin.mokhtari94
ممنون همین custom field رو می خوام پیاده کنم حالا به صورت فرم ساز فقط پلاگین ندارم


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

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