مصطفی
5 سال پیش توسط مصطفی مطرح شد
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
تخصص : برنامه نویس
@amin.mokhtari94 5 سال پیش مطرح شد
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
@mohsenbostan 5 سال پیش مطرح شد
0

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


Mohammad Amin Mokhtari
تخصص : برنامه نویس
@amin.mokhtari94 5 سال پیش مطرح شد
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.fartaj 5 سال پیش آپدیت شد
0

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


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

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


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

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


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

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