<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Mohamad</title>
        <link>https://virgool.io/feed/@Mdhesari</link>
        <description>Software Engineer | Blogger | Tech Enthusiast</description>
        <language>fa</language>
        <pubDate>2026-04-15 01:35:46</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/15102/avatar/GxSJZ6.jpg?height=120&amp;width=120</url>
            <title>Mohamad</title>
            <link>https://virgool.io/@Mdhesari</link>
        </image>

                    <item>
                <title>تغییر نگاه و مدل ذهنی در یکسال گذشته</title>
                <link>https://virgool.io/@Mdhesari/%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-%D9%86%DA%AF%D8%A7%D9%87-%D9%88-%D9%85%D8%AF%D9%84-%D8%B0%D9%87%D9%86%DB%8C-%D8%AF%D8%B1-%DB%8C%DA%A9%D8%B3%D8%A7%D9%84-%DA%AF%D8%B0%D8%B4%D8%AA%D9%87-hnwxk4lasyrl</link>
                <description>بعد از بدست آوردن مدل ذهنی که جدیدا دارم، بازترم به مسائل مختلف و سخت گیری ها و ایده‌آل گرایی هارو سعی کردم تا جای ممکن کم کنم.برای یادگیری آغوشم باز باشه و همینطور برای تست و جلورفتن به خودم اعتماد کنم. باور داشته باشم که میتونم و قابلیت حلش رو دارم. به معنای واقعی کلمه ها بیشتر به خودم اعتماد کنم و باور داشته باشم که میتونم.ذهنم رو محدود به پترن ها نکنم. یافته هامو بنویسم. سولوشن دیزاین براشون داشته باشم. صرفا الگویی که جایی کار میکنه و براتون خوب بوده دلیل نداره اون رو به عنوان چکش استفاده کنید و همه چیو مثل یه میخ ببینید.از too much بودن و complex بودن جلوگیری کنم. ساده بودن و simplicity رو بیشتر بپسندم و دوست داشته باشم و یاد بگیرم که بهتر بشم برای ساده سازی چون در نگاه اول خیلی راحت به نظر میرسه ساده فکر کردن ولی هر چی جلوتر میری سخت تر میشه و در واقع معمولا زمان و انرژی خیلی زیادی میبره ولی زندگی رو زیباتر میکنه.از تست کردن و خطا کردن هیچ ابایی نداشته باشم و برم توو دلش.بخونم و بخونم و بخونم و تمرین کنم و تمرین کنم و تمرین کنم و این چرخه رو ادامه بدم و بطور مستمر بدنبال یادگیری و جلو رفتن باشم و به چیز هایی که بلدم و دارم بسنده نکنم و همیشه دنبال یه ورژن بهتر از ورژن فعلی خودم باشم. حتی اون چیزی که خیلی ریت بالایی در آموزش نداره هم یک چیزی برای یاد دادن داره.نگاه سیستمی رو سعی کنم بیشتر پیاده کنم توو زندگیم و تصمیم گیری و حل مسئله در خودم تقویت کنم. بیشتر فکر کنم و نذارم ذهنم همیشه بایس بشه و خلاقیت رو با استفاده کردن مستمر از هوش مصنوعی و ابزارهای مختلف از خودم نگیرم.</description>
                <category>Mohamad</category>
                <author>Mohamad</author>
                <pubDate>Tue, 18 Feb 2025 11:03:12 +0330</pubDate>
            </item>
                    <item>
                <title>ماجرای انفجار یک ذهن شلوغ!</title>
                <link>https://virgool.io/@Mdhesari/%D9%85%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%D8%A7%D9%86%D9%81%D8%AC%D8%A7%D8%B1-%DB%8C%DA%A9-%D8%B0%D9%87%D9%86-%D8%B4%D9%84%D9%88%D8%BA-m0n25sy9l7wi</link>
                <description>ذهن بهم ریخته‌ام انگار عادت دارد بهم بریزد و کاری نکند جز فکر و خیال! بابت هر چیزی حاضر است همه اینهارا با جان و دل بپذیرد و کوچک ترین راه حلی برای خالی کردنشان نداشته باشد و فقط دروازه افکار مختلف را به روی مسائل باز میکند و آغوش جان میسپارد.آنقدر فکر و خیال میکند، آنقدر دروازه را باز میگذارد که ناگهان مانند پر شدن منابع یک سیستم دیگر جایی برای نگهداری آنها ندارد و سپس منفجر میشود!این انفجار ذهن را به دست و پای قلب می اندازد تا کاری کند! از مشکلات موجود گلایه میکند، قلب هم آنقدر ظریف و لطیف است که با یک کلمه‌ای بهم میریزد و دیگر طاقت این همه بدبختی و درد و بلا را ندارد، ناگهان او هم منفجر میشود!این خبر به چشم ها میرسد و اشک ها سرازیر میشود...</description>
                <category>Mohamad</category>
                <author>Mohamad</author>
                <pubDate>Mon, 08 Jan 2024 13:18:25 +0330</pubDate>
            </item>
                    <item>
                <title>چگونه به همه چیز نظر ندهیم؟</title>
                <link>https://virgool.io/@Mdhesari/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%A8%D9%87-%D9%87%D9%85%D9%87-%DA%86%DB%8C%D8%B2-%D9%86%D8%B8%D8%B1-%D9%86%D8%AF%D9%87%DB%8C%D9%85-q6xckviszv4j</link>
                <description>بارها و بارها دیدیم بعد از هک شدن شرکت ها و سازمان های ایرانی، سر و کله متخصصین سایبری پیدا شد و نظرات مختلف از زیر ساخت گرفته تا کوچک ترین نکته نظر تخصصی خود را اعلام کردند، لابد انتظار دارند سازمان های ایرانی هم برایشان فرش قرمزی پهن کنند و بابت این فخری که به آنها فروخته هدایای نفیسی نیز اهدا کنند!سوال اصلی اینجاست، چرا؟ چرا با وجود نداشتن دانش، تجربه و هر کوفت و زهرمار دیگر بدون اندکی درک از مباحث مختلف شروع میکنیم به نظر دادن تخصصی و میشویم فیلسوف زمانه، متخصصی که همه چیز دان است و لابد مردم هم به اعتبار این متخصصین سایبری و دکوری به‌به و چه‌چه میکنند.همه چیز از مردم شروع میشود و همه چیز با مردم تمام میشود...گاهی اوقات به عنوان متخصص در هر زمینه‌ای وقتی کوچک ترین دانش و تجربه‌ای راجب موضوعات مختلف نداریم و به قول معروف اول راهیم باید کنار بایستیم و یاد بگیریم، تحقیق کنیم و بعد از رسیدن به یک درک نسبی باز هم نظر تخصصی ندهیم و صرفا چیزی که یاد گرفته‌ایم را به اشتراک بگذاریم تا اجازه دهیم متخصصینی که سالهات در این حوزه‌ها کار میکنند و تجربه حرفه‌ای دارند نظر بدهند و  حالا یاد میگیریم و میتوانیم تجربه کنیم تا به یک متخصص واقعی تبدیل شویم. چون ما یاد گرفته‌ایم که فقط حرف بزنیم و نظر بدهیم، بلکه اگر گوش دهیم آگاه میشویم و این آگاهی برای خیلی ها پر هزینه تمام میشود، فکر کنید سالهات مردمی را به این عادات تبدیل کرده‌اند و حالا همان مردم میخواهند آگاه شوند آیا این یک عیب بزرگ برای سیستمی که سالهات سرمایه‌گذاری کرده‌‌اند نیست؟در آخر...این مردم هستند که تصمیم میگیرند، حالا باید خوب فکر کنیم، به حرف و نظر هر کسی اعتماد نکنیم و اگر در زمینه‌ای تخصص نداریم و تجربه ای نداریم سعی کنیم کنار بایستیم تا تجربه‌ای کسب کنیم. باور کنید همه چیز نیاز به نظر تخصصی ما ندارد. که تا پستست خاک اینجا همه نفعست لیک آن گهبلای دیده‌ها گردد، چو بالا گیرد از نکبا</description>
                <category>Mohamad</category>
                <author>Mohamad</author>
                <pubDate>Fri, 05 Jan 2024 12:40:40 +0330</pubDate>
            </item>
                    <item>
                <title>گم شدن...!</title>
                <link>https://virgool.io/@Mdhesari/%DA%AF%D9%85-%D8%B4%D8%AF%D9%86-fnmyfqb9fxjr</link>
                <description>گم شدن همچین هم بد نیست! میدونی آدم اگر نفهمه گم شده مگه میشه خودش رو پیدا کنه؟ فرض کن توو یه جنگلی، مدت‌ ها و روزهاست که داری راه میری و فکر میکنی به زودی میرسی اما هنوز نمیدونی که گم شدی!  اگر متوجه گم شدنمون نشیم تا آخر عمرمون فقط راه میریم و یک مسیری رو فقط طی میکنیم.  پس یه وقتایی آدم باید احساس گم شدن بهش دست بده تا متوجه مسیر اشتباهش باشه! پس اگه توام مثل من یه وقتایی احساس گم شدن توو کارت، زندگیت، رابطت و ... بهت دست میده تنها نیستی.  اگه اهل پادکست هستین برای پیدا کردن خودتون این پادکست هارو به شدت توصیه میکنم :جافکری |‌ https://jafekri.com/ رادیوراه |‌ https://lnkd.in/eQ2jNS8h کتاب :  Man&#x27;s Search for Meaning - Viktor Emil Frankl</description>
                <category>Mohamad</category>
                <author>Mohamad</author>
                <pubDate>Sun, 12 Nov 2023 18:40:19 +0330</pubDate>
            </item>
                    <item>
                <title>۱۰ مبحث پایه ریاضی برای شروع برنامه نویسی که بهتره بلد باشیم!</title>
                <link>https://virgool.io/@Mdhesari/%DB%B1%DB%B0-%D9%85%D8%A8%D8%AD%D8%AB-%D9%BE%D8%A7%DB%8C%D9%87-%D8%B1%DB%8C%D8%A7%D8%B6%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B4%D8%B1%D9%88%D8%B9-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%DA%A9%D9%87-%D8%A8%D9%87%D8%AA%D8%B1%D9%87-%D8%A8%D9%84%D8%AF-%D8%A8%D8%A7%D8%B4%DB%8C%D9%85!-ox16nhlxerz1</link>
                <description>دغدغه خیلی از دوستانی که میخوان تازه شروع به برنامه نویسی کنن وجود ریاضیات در برنامه نویسی هست، اما واقعا چقد ما به ریاضیات در برنامه نویسی وابسته‌ایم؟!اولین جوابی که خیلی از ماها موقع پرسیدن این سوال میشنویم اینه که شما نیازی به ریاضیات ندارین و واقعا هم ندارین اما واقعیت ماجرا اینه که بلد بودن مباحث پایه ریاضی میتونه سرعت پیشرفت شما در برنامه نویسی رو افزایش بده.حالا بریم و ۱۰ تا از مهم ترین مباحث پایه ریاضی رو ببینیم : ۱. منطق بولین (Boolean Algebra)در منطق بولین که ما خیلی توو برنامه نویسی بکارمون میاد بحث 0 و 1 بودن یک متغیر هست، برای مثال : شما پیتزا رو دوست دارین یا ندارین دو حالت بیشتر نداره :var doesHerLikePizza = true | falseممکنه بعضی وقتا شرایط فرق کنه و شما مثلا فقط پیتزا پپرونی رو دوست داشته باشین اونوقت ما به ذائقه شما احترام میذاریم و همچین کدی رو توو برناممون مینویسیم :doesHerLikePizza &amp;&amp; isPizzaKindPepperoniشایدم ممکنه همه پیتزا هارو دوست داشته باشین و فقط از پپرونی بدتون بیاد :doesHerLikePizza &amp;&amp; ! isPizzaKindPepperoniاز علامت ! برای برعکس کردن اون متغیر استفاده میکنیم اگر 1 یا true باشه شرایط مارو پاس نمیکنه و ما انتظار 0 یا false رو داریم.اطلاعات بیشتر توو ویکی پدیا هست.۲. سیستم اعداد (Numeral Systems)در برنامه نویسی و کامپیوتر ما عدد 45 نداریم بلکه عدد 101101 داریم، یعنی همه چی توو کامپیوتر و نرم افزار 0 و 1 هست که اصطلاحا به اونها میگیم اعداد باینری، اما اینطور نیست که شما نتونید اصلا اعداد decimal (همون اعدادی که معمولا خودمون استفاده میکنیم) رو بنویسین، همه چیزی که ما در هر زبان برنامه نویسی مینویسیم در نهایت تبدیل به اعداد صفر و یک (باینری) میشه و اگر میخواید بیشتر یاد بگیرین من این دوره رایگان فرادرس رو پیشنهاد میکنم.البته باید بدونید که ما اعداد hexadecimal هم داریم و یاد گرفتن همه اینا به ما کمک میکنه تا بتونیم برنامه و کد های بهتری بنویسیم.مثال ساده اش توو css هست برای اعداد hexadecimal ما اعداد 0 تا 9 و A تا F رو داریم، یعنی دیگه برای ۱۰ از ۱۰ استفاده نمیکنیم و بجاش A و ۱۱ و ۱۲ هم حروف خودشون رو دارن و این تا 15 که F هست ادامه پیدا میکنه و ما با این اعداد میتونیم برای css رنگ های مختلفی بسازیم :color: #F3EEEA۳. اعداد اعشاری (Floating Point Numbers)بعضی حالت های اضطراری وجود داره که دونستن اعداد اعشاری و چجوری کار کردن اونها بدردتون میخوره و خیلی جاها با مسلط بودن بهشون میتونین خیلی سریعتر کدتون رو دیباگ کنید.مثلا یک خط کدی که توو جاوا اسکریپت ران شده و ممکنه باعث سوپرایز بشه :14900*(10.8/100) = 1609.200000000003 (Javascript)البته اگه از من میشنوید و تازه دارین وارد حوزه برنامه نویسی میشن خیلی به ریاضیات جاوا اسکریپت اعتماد نکنید :))۴. لگاریتم ها (Logarithmic Functions)یادگیری لگاریتم ها زمانی به شما کمک میکنن که میخواین الگوریتم های پیچیده ای مثل باینری سرچ بنویسید.این مقاله نمیخوام وارد جزئیات بشم و صرفا میخوام معرفی کنم، اگه دوست دارین راجب لگاریتم بیشتر بدونین این آموزش ویدیویی بدردتون میخوره :https://www.aparat.com/v/JelKI۵. نظریه مجموعه ها (Set Theory)مهم ترین کاربرد مجموعه در دیتابیس ها هستند، جایی که ما کالکشنی از اطلاعات رو داریم و بحث منحصر بفرد و دسته بندی اونها نقش مهمی رو در ساختار بندی دیتابیس ایفا میکنه.عملیاتی مثل join, union, intersection در دیتابیس از دل مجموعه ها بیرون میاد.۶. ریاضی ترکیبی (Combinatorics)ترکیبیات یا ریاضی ترکیبی ساختار های متنوعی رو بررسی میکنه و برای شمارش ساختار های دارای حالت بکار میاد، در برنامه نویسی برای بهینه سازی ساختار های گراف،‌ الگوریتم های ساده و پیچیده بکار میره و یک تخصص خیلی با ارزش در برنامه نویسی به حساب میاد!۷. نظریه گراف (Graph Theory)همونطور که از اسمش پیداست یک شاخه ای از ریاضیه که در برنامه نویسی هم خیلی بکار میاد مثلا توو معماری نرم افزار و دیتابیس ها ما از نظریه گراف خیلی بهره میبریم، با ترکیب اینها یک نرم افزار استاندارد و اصولی رو طراحی میکنیم. پیشنهاد میکنم حتما این مقاله انگلیسی رو مطالعه کنید :https://betterprogramming.pub/a-short-practical-programmers-guide-to-graph-theory-bfc87bc52581۸. نظریه پیچیدگی محاسباتی (Complexity Theory (Big O Notation))این مبحث به ما برای بهبود و بنچمارک کردن الگوریتم های مختلف کمک میکنه، به ما اطلاعاتی از زمان و مقدار منابع مورد نیاز برای اجرای الگوریتم و بهینه سازی اون میده و بسیار در برنامه نویسی حرفه‌ای و علوم رایانه پر کاربرد هست.با داشتن تصویر از نمودار Big 0 Notation ما خیلی بهتر میتونیم برای انتخاب الگوریتم های مختلف بر اساس منابع تصمیم‌گیری کنیم.۹. آمار (Statistics)پرکاربرد ترین حوزه علوم رایانه که از آمار استفاده میکنه هوش مصنوعی هست، ما با ترکیب ابزار های مختلف و ورودی میلیونها و میلیارد ها اطلاعات مختلف و استفاده از مبحث آمار در ریاضیات میتونیم تحلیل ها و پیش‌بینی های کارآمد و نسبتا دقیقی انجام بدیم.آمار در ویکی‌پدیا۱۰. جبر خطی (Linear Algebra)تقریبا در همه حوزه های علوم رایانه شما میتونین رد پای جبر خطی رو حس کنین: گرافیک، شبکه های عصبی، کریپتوگرافی، یادگیری ماشین و ...در آخر...این ۱۰ مورد از پایه ترین مباحث ریاضی بود و نمیگیم باید ولی بهتره به عنوان یک برنامه نویس بلد باشید، البته اگر بخواین رو حوزه های مختلف علوم رایانه مثل هوش مصنوعی تمرکز کنید &quot;بهتره&quot; تبدیل به  &quot;باید&quot; میشه و شما حتما باید نه تنها به این مباحث بلکه به خیلی از مباحث دیگه برای خبره شدن در اون حوزه مسلط باشید.موفق باشید.منبع : dev.to</description>
                <category>Mohamad</category>
                <author>Mohamad</author>
                <pubDate>Sat, 11 Nov 2023 18:21:38 +0330</pubDate>
            </item>
                    <item>
                <title>Phpstorm xdebug sail آموزش</title>
                <link>https://virgool.io/@Mdhesari/phpstorm-xdebug-sail-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-mh7pcsw8kiaj</link>
                <description>phpstorm xdebug sailhttps://medium.com/codex/laravel-8-0-sail-xdebug-phpstorm-5cc900e96da4Install xdebugConfig PHPSTORM IDE to match xdebug configuration port and server. Run &gt; Edit configurations...+ add server &gt; PHP Remote DebugConfig your server nameRun &gt; Web server debug validationpath to create validation script: [public directory of your laravel project]press validatechange docker-compose.yml file :# For more information: https://laravel.com/docs/sail
version: &#039;3&#039;
services:
    laravel.test:
        build:
            extra_hosts:
                - &#039;host.docker.internal:host-gateway&#039;
            context: ./vendor/laravel/sail/runtimes/8.1
            dockerfile: Dockerfile
            args:
                WWWGROUP: &#039;${WWWGROUP}&#039;
                XDEBUG: &#039;${XDEBUG}&#039;
                XDEBUG_PORT: &#039;${XDEBUG_PORT}&#039;
        image: sail-8.1/app
        extra_hosts:
            - &#039;host.docker.internal:host-gateway&#039;
        ports:
            - &#039;${APP_PORT:-80}:80&#039;
        environment:
            WWWUSER: &#039;${WWWUSER}&#039;
            LARAVEL_SAIL: 1
            XDEBUG_MODE: &#039;${SAIL_XDEBUG_MODE:-off}&#039;
            XDEBUG_CONFIG: &#039;${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}&#039;
            PHP_IDE_CONFIG: serverName=Docker
        volumes:
            - &#039;.:/var/www/html&#039;
        networks:
            - sail
        depends_on:
            - mysql
            - redis
    mysql:
        image: &#039;mysql/mysql-server:8.0&#039;
        ports:
            - &#039;${FORWARD_DB_PORT:-3306}:3306&#039;
        environment:
            MYSQL_ROOT_PASSWORD: &#039;${DB_PASSWORD}&#039;
            MYSQL_ROOT_HOST: &amp;quot%&amp;quot
            MYSQL_DATABASE: &#039;${DB_DATABASE}&#039;
            MYSQL_USER: &#039;${DB_USERNAME}&#039;
            MYSQL_PASSWORD: &#039;${DB_PASSWORD}&#039;
            MYSQL_ALLOW_EMPTY_PASSWORD: 1
        volumes:
            - &#039;sail-mysql:/var/lib/mysql&#039;
        networks:
            - sail
        healthcheck:
            test: [&amp;quotCMD&amp;quot, &amp;quotmysqladmin&amp;quot, &amp;quotping&amp;quot, &amp;quot-p${DB_PASSWORD}&amp;quot]
            retries: 3
            timeout: 5s
    redis:
        image: &#039;redis:alpine&#039;
        ports:
            - &#039;${FORWARD_REDIS_PORT:-6379}:6379&#039;
        volumes:
            - &#039;sail-redis:/data&#039;
        networks:
            - sail
        healthcheck:
            test: [&amp;quotCMD&amp;quot, &amp;quotredis-cli&amp;quot, &amp;quotping&amp;quot]
            retries: 3
            timeout: 5s
networks:
    sail:
        driver: bridge
volumes:
    sail-mysql:
        driver: local
    sail-redis:
        driver: localadd into your php.ini file :[xdebug]
zend_extension=xdebug.so
xdebug.profiler_enable=1
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=host.docker.internal
xdebug.remote_port=9000
xdebug.remote_autostart=1
xdebug.remote_connect_back=1
xdebug.idekey=PHPSTORM
xdebug.mode=debugInstall xdebug browser extension :Chrome/Firefox/...After installation you need to config Xdebug extension :go to xdebug extension options &gt; IDE KEY section &gt; Select PHPSTORM from dropdown listenable xdebug extension and set breakpoints in your IDEgo and enjoy :)</description>
                <category>Mohamad</category>
                <author>Mohamad</author>
                <pubDate>Sat, 12 Mar 2022 16:16:32 +0330</pubDate>
            </item>
                    <item>
                <title>جلوگیری از مموری لیک در لاراول در زمان اجرای صف ها</title>
                <link>https://virgool.io/@Mdhesari/laravel-queus-memory-lick-fix-in-sharing-hosts-tp063z8xvbir</link>
                <description>Laravel Queuesزمانی که در هاست های اشتراکی اپلیکیشن لاراولی‌تون رو اجرا میکنید و همچنان قصد دارید از صف ها استفاده کنید بهتره به این نکات توجه کنید.1. اگر از سوپروایزر استفاده نمیکنید و قصد دارید صف هارو با کران جاب مدیریت کنید.فقط یکبار کران جاب ست کنید و اون هم به زمانبندی کرنل لاراول باشه.php artisan schedule:runو در کرنل  لاراول دستور اجرای صف هارو ایجاد کنید.$schedule-&gt;command(&#039;queue:work&#039;)-&gt;everyMinute();اما این پایان کار نیست و در ادامه وقتی پردازش های سرور زیاد بشه با توجه به منابع محدودی که در هاست اشتراکی موجود هست خیلی راحت به memory lick میخورید.برای حل این مشکل ما راه حل های مختلفی داریم که توصیه میکنم این مقاله خوب رو مطالعه کنید.اما اگر بخوام بطور خلاصه بهتون بگم کافیه از آپشن های--rest--sleep$schedule-&gt;command(&#039;queue:work&#039;, [&#039;--rest&#039; =&gt; 0.5,&#039;--sleep&#039; =&gt; 5,])-&gt;everyMinute();استفاده بشه، با استفاده از این آپشن ها بین جاب هایی که قرار هست ارا بشه نیم ثانیه تاخیر میذاریم و همچنین در صورت خالی بودن صف ها ۵ ثانیه به سرور استراحت میدیم تا به بررسی پردازش های دیگه بپردازه.دقت کنید که راه حل های مختلفی هست و ممکنه این راه حل در کوتاه مدت بهتون کمک کننه و طبیعتا زمانی که مقیاس محصولتون بزرگتر میشه نیاز به بهبود این راه حل ها دارید.موفق باشید.</description>
                <category>Mohamad</category>
                <author>Mohamad</author>
                <pubDate>Tue, 11 Jan 2022 13:24:55 +0330</pubDate>
            </item>
                    <item>
                <title>چرا بهتره از jsconfig.json در پروژه های جاوا اسکریپت استفاده کنید | Vscode lovers</title>
                <link>https://virgool.io/@Mdhesari/%DA%86%D8%B1%D8%A7-%D8%A8%D9%87%D8%AA%D8%B1%D9%87-%D8%A7%D8%B2-jsconfigjson-%D8%AF%D8%B1-%D9%BE%D8%B1%D9%88%DA%98-%D9%87%D8%A7%DB%8C-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%DA%A9%D9%86%DB%8C%D8%AF-vscode-lovers-o6kz3g4fkhd5</link>
                <description>اگر از vscode استفاده میکنید،‌برای بهبود تجربه توسعه پروژه های جاوا اسکریپتی مخصوصا Reactjs یا Vuejs فایلی هست به اسم jsconfig.js که به ما در امر توسعه این پروژه بسیار کمک میکنه و کاربردیه.اصلا چی هست؟!وی‌اس‌کد برای بهبود تجربه توسعه زبان جاوا اسکریپت و ابزار های اون این فایل رو در اختیار توسعه دهنده ها قرار میده تا ساختار کد ها و تجربه کد زدنشون رو لذت بخش کنن.برای مثال تصور کنید ما یه پروژه لاراولی رو با استارتر کیت Laravel Breeze Inertia توسعه دادیم. اگر فایل webpack.config.js رو باز کنید. با همچین کدی روبرو میشید.const path = require(&#039;path&#039;);module.exports = {    resolve: {        alias: { &#039;@&#039;: path.resolve(&#039;resources/js&#039;),        },   },};‍کد بالا در کانفیگ وب پک استفاده میشه و به دسترسی به ماژول ها و پکیج های ما کمک میکنه. برای مثال alias که تعریف شده به عنوان &#x27;@&#x27; به ما این امکان رو میده که بجای برگشتن و لود ماژول مورد نظر ما آدرس دیرکتوری مورد نظر رو به عنوان alias در نظر میگیریم و به این شکل براحتی و زیبایی میتونیم کامپوننت ها و ماژول هامون رو لود کنیم.مثلا بجای وارد کردن آدرس به صورت کامل یا عقب رفتن برای دسترسی به دیرکتوری :import Input from `../../Components/Input.vue`از alias تعریف شده استفاده میکنیم :import Input from `@/Components/Input.vue`شما میتونید با همین فرمون جلو برید و چندین alias دیگه بر اساس دیرکتوری های مورد نیازتون درست کنید :const path = require(&#039;path&#039;);module.exports = {    resolve: {        alias: {            &#039;@&#039;: path.resolve(&#039;resources/js&#039;),            &#039;@Components&#039;: path.resolve(&#039;resources/js&#039;/Components),        },    },};که با alias دوم میتونیم براحتی به دیرکتوری Components دسترسی داشته باشیم.استفاده در پروژه لاراولحالا برای استفاده در پروژه لاراولی خودمون میایم و یه فایل jsconfig.json در روت پروژه خودمون ایجاد میکنیم و چنین ساختاری رو میتونیم داخلش داشته باشیم :{
&amp;quotcompilerOptions&amp;quot: {    &amp;quotbaseUrl&amp;quot: &amp;quot.&amp;quot,    &amp;quotpaths&amp;quot: {      &amp;quot@/*&amp;quot: [        &amp;quotresources/js/*&amp;quot      ],      &amp;quot@Components/*&amp;quot: [        &amp;quotresources/js/Components/*&amp;quot      ]    }  },  &amp;quotexclude&amp;quot: [    &amp;quotnode_modules&amp;quot,    &amp;quotpublic&amp;quot  ]}نکته : ممکن است بعد از ایجاد فایل jsconfig.json نیاز به راه اندازی مجدد vscode داشته باشید.امیدوارم که از این مقاله لذت برده باشید.</description>
                <category>Mohamad</category>
                <author>Mohamad</author>
                <pubDate>Tue, 10 Aug 2021 18:04:47 +0430</pubDate>
            </item>
                    <item>
                <title>ران کردن لاراول در لوکال با داکر Laravel Sail</title>
                <link>https://virgool.io/@Mdhesari/laravel-with-docker-laravel-sail-zx6cdhp1kyt8</link>
                <description>https://laravel-news.com/laravel-sailپکیج جدید و فوق العاده جذاب دیگه از لاراول به نام Laravel Sail در دسامبر ۲۰۲۰ توسط تیلور اوتول (سازنده لاراول) رونمایی شد و حالا با این پکیج میتونید براحتی اپ لاراولیتون رو بدون هیچ تجربه ای با داکر ران کنید.با این پکیج یا ایمیج شما حتی نیاز ندارید پکیج منیجر های composer و npm رو هم در سیستم خودتون نصب کنید و همینطور ماژول های نرم افزاری دیگه مثل mysql, nginx, redis و ...نصب داکرقبل از هر چیزی فقط کافیه داکر و داکر کامپوز رو روی سیستم عامل خودتون نصب کنید.آموزش ها متنوع زیادی در سطح وب و داکیومنت های خود داکر وجود داره که میتونید استفاده کنید.ویندوز :https://docs.docker.com/docker-for-windows/install/مک :https://docs.docker.com/docker-for-mac/install/لینوکس (ubuntu)  :https://docs.docker.com/engine/install/ubuntu/لینوکس (centOS) :https://docs.docker.com/engine/install/centos/لینوکس (fedora) :https://docs.docker.com/engine/install/fedora/بعد از نصب داکر نیاز دارید داکر کامپوز هم نصب کنید که براحتی میتونید با خوندن داکیومنت مربوطه اش اینکارو انجام بدید :https://docs.docker.com/compose/install/حالا بریم برای ران کردن لوکال با Laravel Sailخب قبل از هر چیزی باید یه پروژه لاراولی داشته باشیم پس من یه پروژه جدید رو با استفاده از cli استارت میزنم :composer create-project laravel/laravel MyProjectحالا پروژه خودم رو باز میکنم، بعد از نصب پکیج ها و اقدامات اولیه برای پروژه مثل :composer install
cp .env.example .env
php artisan key:generate و شروع به نصب پکیج Laravel Sail میکنم :composer require laravel/sail --devاز اونجایی که فقط میخوام در زمان توسعه و لوکال از این پکیج استفاده کنم از آپشن --dev استفاده میکنم برای نصبش که دیگه در زمان پروداکشن این پکیج نصب نشه.بعد از نصب شدن پکیج، برای اینکه مطمئن بشیم همه فایل هامون به درستی لود میشه یه دستور دیگه رو هم اجرا میکنم :composer dumpautoloadحالا شروع به نصب پکیج در پروژه مون میکنم :با دستور زیر یه فایل docker-compose.yml به روت پروژه مون پابلیش میشه که این فایل مخصوص داکر هست که با استفاده از اون میاد و ماژول های نرم افزاری که براش تعریف کردیم رو داکر شروع به بیلد میکنه (که جلوتر متوجه میشیم).php artisan sail:installحالا فقط کافیه یه دستور دیگه رو بزنیم و پروژه مون رو به همین راحتی روو لوکال بالا بیاریم :./vendor/bin/sail upدستور بالا چیز خاصی نیست! فقط میاد چنتا دستور داکر رو ران میکنه و بجای اینکه ما بریم و با دستور های داکر آشنا شیم خودش همه دستوراتشو میزنه و فقط همین رو برای بالا اوردن پروژه مون در اختیار ما گذاشته.اگه میخوایم همه کانتینر ها در بک گراند اجرا بشه از آپشن -d استفاده میکنیم. ./vendor/bin/sail up -dچیزی مثل دستور زیر اجرا میشه :docker-compose up -d --build داکر شروع میکنه به بیلد کردن سرویس هایی که توو فایل docker-compose.yml نامبرده شده مثل mysql، redis و ...ما ایمیج های مختلفی رو توو داکر داریم (رسمی و غیر رسمی) که در داکر هاب (یه چی مثل گیت هاب میمونه) گذاشته شدن و میتونیم ازشون استفاده کنیم.حتی میتونیم یه ایمیج خاص رو از داکر هاب از قبل دانلود کنیم :docker pull mysql
خیلی خب، از بحث اصلی خارج نشیم! بعد از دستور sail up ممکنه به یه سری از مشکلاتی بخوریم و اون خالی نبودن پورت هایی که با استفاده از داکر expose میشه در سیستم خودتون هست و باید اول پورت های localhost مثل 80 و 3306 که برای وب سرور و دیتابیس mysql استفاده میشن رو خالی کنید.همه پورت هایی که این پکیج بهشون نیاز داره تا خالی باشن :web server : 80mysql : 3306redis : 6309mailhog : 1025, 8025شخصی سازیاگه به داکر مسلط هستید به راحتی میتونید فایل های داکر این پکیج رو کاستومایز کنید فقط کافیه دستور زیر رو اجرا کنید :php artisan sail:publishبا استفاده از دستور بالا یه فولدر جدید با نام docker در روت پروژه پابلیش میشه که حاوی داکر فایل هایی هستن که داکر برای بیلد استفاده میکنه.کانفیگ اطلاعات دیتابیس و ...اگه به فایل docker-compose.yml دقت کنید.شما هر چیزی که داخل فایل متغیر ها (.env) تعریف کردید از جمله پورت ها، اطلاعات دیتابیس، یوزر و پسورد دقیقا طبق همین ها دیتابیس یا هر سرویسی که مربوط به لاراول باشه بیلد میشه.docker-compse.ymlاجرا کردن دستورات مختلف در کانتینر (پروژه اجرا شده در لوکال) :برای اینکه دستورات مختلف artisan و bash رو اجرا کنید، دستورات مخصوصش در این پکیج گذاشته شده :./vendor/bin/sail artisanبا دستور بالا میتونید دستورات مربوط به Artisan رو اجرا کنید مثلا :./vendor/bin/sail artisan migrateاگه نیاز دارید که دستورات غیر از Artisan مثل npm یا دستورات ترمینال مختلفی رو اجرا کنید فقط کافیه با استفاده از دستور زیر وارد کانتینر در حال اجرا بشید :./vendor/bin/sail shellبا زدن دستور بالا شما به ترمینال کانتینر ورود میکنید و حالا داخل پروژه اصلیتون که در حال اجرا هست قرار دارید و میتونید هر دستوری که میخواین رو اجرا کنید.Laravel Sail Shellو اینکه اگر خواستید مستقیم به tinker وصل بشید :./vendor/bin/sail tinkerنکتهبرا اینکه هر سری بجای ./vendor/bin/sail فقط کلمه sail رو تایپ کنید کافیه یه alias در bash بسازید :alias sail=&amp;quotbash ./vendor/bin/sail&amp;quotاگر دستور docker ps رو در ترمینال اجرا کنید همه کانتینر هایی که در حال اجرا هستند رو میبینید.در آخر...امیدوارم همه چیز رو خیلی خوب یاد گرفته باشید و برای اجرا مشکلی نداشته باشید، در غیر اینصورت توو کامنت ها وقت کنم حتما جوابتونو میدم.هدف اصلی این پکیج راحت کردن و در دسترس گذاشتن اجرا اپلیکیشن های لاراولی با داکر برای همه هست.خیلی از سرویس های خوب دیگه در این پکیج هستن که با توجه به بلند شدن مقاله میخوام در مقاله های بعدی معرفی کنم، با این پکیج یه محیط لوکال فوق العاده عالی که یه اپ لاراولی میتونه داشته باشه رو در اختیار خواهید داشت.در مقاله بعدی میرم سراغ اجرای phpmyadmin (مدیریت دیتابیس)، استفاده از mailhog و ران کردن پروژه لوکال با یه دستور توو یه سرور رایگان و قابل دسترس در سطح اینترنت!</description>
                <category>Mohamad</category>
                <author>Mohamad</author>
                <pubDate>Sun, 27 Dec 2020 18:09:23 +0330</pubDate>
            </item>
                    <item>
                <title>درک روابط دیتابیس در پکیج ORM لاراول با تحلیل پروژه واقعی! بخش دوم</title>
                <link>https://virgool.io/@Mdhesari/laravel-polymorphic-has-through-relationships-pkssrvmd9p4t</link>
                <description>در بخش اول این سری از آموزش درک پکیج ORM لاراول سه مفهوم رابطه ای رو بخوبی درک کردیم و پروژه محور پیش بردیم.یک به یک ( one-to-one )یک به چند ( one-to-many )چند به چند ( many-to-many )در بخش دوم و پایانی قصد دارم دو مفاهیم through و polymorphic رو شرح بدم و باهم کلی چیزا یاد بگیریم.رابطه میانی (Through)رابطه چند ریختی (PolyMorphic)برای این قسمت هم، پروژه ابتدایی که بررسی کردیم رو جلو میبریم و روی همون کار میکنیم، اجازه بدید یه نگاه دیگه به دیاگرام هامون بندازیم :دیاگرام موجودیت های دیتابیس پروژههمونطور که در بخش اول گفته شد، در پروژه ما برای شروع MVP میتونیم 7 جدول داشته باشیم که روال کار رو بصورت ساده برای یک پلتفرم مارکت پلیس انجام بدیم.users (کاربران)shops (فروشگاه ها)shops_setting (تنظیمات بیشتر فروشگاه ها)products (محصولات)carts (سبد های خرید)invoices (صورت حساب ها)cart_product (جدول رابط محصولات با سبد های خرید)ضمن اینکه مقاله قسمت قبل رو پیشنهاد میکنم حتما مطالعه کنید.رابطه یک به چند میانی (Has Many Through)حالا فرض کنیم ما بدون در نظر گرفتن فروشگاه های یه کاربر میخوایم همه محصولات متعلق به اون کاربر رو بگیریم و بهش در پنل نمایش بدیم، اینجاست که رابطه میانی به کمکون میاد و به ما این امکان رو میده تا بتونیم با استفاده از یک جدول رابط به جدول دیگه که هیچ ارتباطی (کلید خارجی) با جدول اصلیمون نداره دسترسی پیدا کنیم و اطلاعات اون رو بگیریم.اینجا جدول اصلیمون users هست و جدول رابطمون shops هستش و ما قصد داریم از طریق جدول فروشگاه ها (shops) به جدول محصولات (products) به کاربر برسیم. در واقع میخوایم هر کاربری با هر تعداد فروشگاهی که داره همه محصولات فروشگاه هاش رو بگیریم.به این شکل میتونیم در مدل کاربر این کار رو انجام بدیم :مدل User و استفاده از متود hasManyThroughدر تصویر بالا اگه ببینید ما برای گرفتن محصولات یه کاربر از متود hasManyThrough که در کلاس Model اصلی هسته لاراول قرار داره استفاده میکنیم و میتونیم شش پارامتر به متود hasManyThrough پاس بدیم و به ترتیب به این شکل هست : نام کلاس مدل جدولی که میخوام در نهایت بهش برسیم products هستنام کلاس مدل جدولی که به عنوان رابط عمل میکنه و جدول users رو به products ارتباط میدهاسم کلید خارجی که جدول اصلی ما در جدول رابط shops داره نام کلید خارجی که جدول فروشگاه ها (shops) ما در جدول نهاییمون یعنی products دارهنام کلید اصلی که جدول اصلی ما (users) داره، همونطور که میدونیم همه جدول هامون کلید های اصلیشون رو id گذاشتیمنام کلید اصلی که جدول فروشگاه ها (shops) دارهحالا چه اتفاقی در کوئری sql میوفته و این دستور به چه شکلی اجرا میشه؟! به همین راحتی با استفاده از  inner join، پکیج ORM لاراول این کوئری رو اجرا میکنه :select * from `products` inner join `shops` on `shops`.`id` = `products`.`shop_id` where `shops`.`user_id` = ?در صورتی که میخوایم از رابطه یک به یک میانی استفاده کنیم، متود hasOneThrough رو داریم و همون پارامتر های قبلی که به hasManyThrough پاس دادیم رو میتونیم استفاده کنیم.رابطه چند ریختی (PolyMorphic)رابطه چند ریختی به ما این امکان رو میده تا بتونیم از یک جدول برای دو یا چند جدول، بجای ایجاد جدول های جدید برای هر کدوم از اونها استفاده کنیم.شاید یکم سخت و گنگ باشه اما با یه مثال خیلی راحت میشه!فرض کنید ما قصد داریم برای کاربران و فروشگاه هاشون عکس در نظر بگیریم و بیان و عکس مورد نظر خودشون رو بذارن و استفاده کنن.اگر در حالت عادی بخوایم جلو بریم باید هم برای فروشگاه و هم برای کاربران یک جدول مجزا ایجاد کنیم و آدرس عکس های انتخابی کاربر رو در جدول هامون ذخیره کنیم.رابطه polymorphic اینجا به کارمون میاد، جایی که به ما این امکان رو میده از ایجاد جدول اضافی جلوگیری کنیم و بجاش از یک جدول متمرکز که دیاگرامش رو در شکل زیر میبینید استفاده میکنیم :pictures table diagramدر دیاگرام بالا دو فیلد pictureable_id و pictureable_type مهم ترین بخشی هستن که باید بهش توجه کنید.ما میخوایم این جدول به صورت متمرکز عمل کنه و هر جدولی که قراره محتوای تصویری هم داشته باشه با این جدول مدیریت بشه.فیلد pictureable_id : آیدی جدولی هست که این عکس به اون تعلق داره، در پروژه ما میتونه یکی از آیدی ها usres یا shops باشه.فیلد pictureable_type : فیلدی هست که بصورت اتوماتیک توسط هسته ORM لاراول شناسایی و ایجاد میشه و نام کلاس مدلی هست که این تصویر به جدول اون تعلق داره.خیلی خوب اگه این دو فیلد رو خوب یاد گرفتی یعنی هیچ مشکلی برای ادامه نداری و فقط کافیه با چندتا متود که مربوط به polymorhpic هست آشنا بشی.من میام، مدل و فایل migration های جدول pictures رو با دستور زیر ایجاد میکنم.$ php artisan make:model Picture -mبا دستور بالا دو فایل &quot;Picture.php&quot; (مدل) و &quot;create_pictures_table.php&quot; (مایگریشن) ایجاد میشن؛ بعد میام و طبق دیاگرام بالا فیلد های pictures رو توسط Schema Blueprint لاراول ایجاد میکنم.Pictures migrationهمونطور که بالا میبینید هیچ نامی از هیچ جدولی آورده نشده و فیلد pictureable_type قرار هست که این کار رو انجام بده و جدول ها متنوعی رو شناسائی کنه.حالا میخوام از این جدول ابتدا برای جدول کاربران (users) استفاده کنم و به این شکل عمل میکنم :User picture method using morphOneدر تصویر بالا از متود morphOne که یک رابطه یک به یک، چند ریختی هست استفاده کردم (یعنی هر کاربر میتونه یک تصویر پروفایل داشته باشه)، به این متود میتونیم 5 پارامتر پاس بدیم :نام کلاس مدل اون جدول متمرکزمون هست که اینجا App\Picture هست.نام پیشوند فیلد های id و type هست که در صورتی که پارامتر های سوم و چهارم رو بزنیم این تقریبا بلا استفاده میشه.نام کلید type (اسم کلاس) هست که در جدول pictures ایجاد کردیم، در اینجا ما با استاندارد های ORM لاراول پیش رفتیم و pictureable_type رو گذاشتیم.نام کلید id (نام آیدی ردیفی هستش که بهش تعلق داره) مثلا عکس ردیف ایدی 3 که در pictures قرار داره میتونه به آیدی 4 کاربر که در users قرار داره لینک بشه.نام کلید محلی هستش که در جدول های چندریختیمون استفاده میشه، مثلا در جدول کاربران (users) کلید محلی ما id هست. بعد از انجام همه این کار ها، در صورتی که نام جدول ها و فیلد هامون رو به درستی وارد کرده باشیم میتونیم از اونها به این شکل استفاده کنیم، مثال :$user-&gt;pictureبا توجه به اینکه متود picture رو در مدل User استفاده کردیم، میدونیم که برای گرفتن آبجکت مدل جدول مرتبط باید اسم متود رو به عنوان پراپرتی استفاده کنیم تا آبجکت مدل به ما داده بشه.حالا چطور برعکس اینکار رو انجام بدیم؟! یعنی از طریق آبجکت picture به user دسترسی داشته باشیم؟به همین راحتی، ابتدا در مدل Picture یه متود به اسم pictureable ایجاد میکنیم و با استفاده از متود morphTo اینکارو انجام میدیم :Pictures Picturable methodهمونطور که میبینید پارامتر ها هم دقیقا مثل متود morphOne هست فقط فرقش اینه که این یکی کمتره و دیگه به پارامتر اول یعنی نام کلاسی که قرار هست چند ریختی رو انجام بده، نیازی نداره.به همین راحتی میتونیم کاربری که این عکس متعلق به اون هست رو بگیریم :$picture-&gt;picturable اگه بخوایم عکس جدید برای کاربر بذاریم؟!$user-&gt;picture()-&gt;create([    &#039;url&#039;  =&gt;  &#039;user_profile_new.jpg&#039;])فقط دقت داشته باشید، برای اینکه یه عکس جدید برای کاربر بذاریم، این راه رو میریم اما قبلش باید یه کوئری انجام بدیم که آخرین عکسی که آپدیت شده رو بذاریم یا اینکه بیایم و تصویر قبلی رو حذف کنیم.$user-&gt;picture()-&gt;latest()-&gt;first()حالا میرسیم به اصل ماجرا یعنی بیایم و از همین جدول pictures برای shops هم استفاده کنیم.اینجا متوجه میشیم که این polymorphic چه موجود جذابیه که در ORM لاراول کارش رو انجام میده! ?برای استفاده از pictures در shops ابتدا مدل Shop رو باز میکنم و یک متود با نام picture دقیقا مثل متودی که در User ایجاد کردیم درست میکنم. (میتونیم این متود رو به trait تبدیل کنیم تا از ریپیت کردن هم جلوگیری کنیم)Shop model get picture using morphOneهمونطور که میبینید دقیقا مثل متودی هست که من در مدل User استفاده کردم و هیچ فرقی نداره.حالا به همین راحتی میتونم تصویر فروشگاه رو بگیرم که در صورت اینکه هیچ تصویری نباشه، null برگشت داده میشه.$shop-&gt;pictureبه همین راحتی تونستیم بدون ایجاد کردن جدول دیگه، از یک جدول برای دو جدول مختلف استفاده کنم.متود morphOne این کوئری رو اجرا میکنه :select * from `pictures` where `pictures`.`pictureable_id` = ? and `pictures`.`pictureable_id` is not null and `pictures`.`pictureable_type` = ?اما این بحث جذاب حالا حالا ها ادامه داره...حالا اپ داره بزرگتر میشه و ما میخوایم حجم زیادی از محصولات و فروشگاه هایی که توسط کاربران ایجاد شده رو دسته بندی کنیم تا بتونیم راحت تر اون هارو مدیریت کنیم، این امکان رو به کاربران بدیم تا تگ یا دسته بندی ها متنوعی با تعداد نامحدود روی محصولات و فروشگاه هایی که دارن ایجاد کنن.مثلا : رضا یه فروشگاه موبایل داره و میاد و تگ های #موبایل #لوازم_جانبی #فروش_موبایل میزاره و همچنین برای یه محصولی که مثلا گوشی اپل باشه تگ #apple یا #آیفون رو قرار میده.رابطه های چند به چند معمولا سخت و گنگ به نظر میرسه اما با بیشتر کار کردن باهاشون این موضوع هم رفع میشه.ما برای پیاده سازی این رویکرد نیاز به دو جدول داریم :tagstaggablesجدول tags هر تگی که ایجاد میشه بدون در نظر گرفتن اینکه چه کسی اون رو ساخته در خودش ذخیره میکنه و جدول taggables اصطلاحا جدول junction ما هست و میاد و تگ هارو با جداولی که میخوان با tags رابطه داشته باشن لینک میکنه و رابطه چند به چند رو اجرا میکنه.برای شروع من طبق دیاگرام جدول هام رو ایجاد میکنم :Taggables and Tags tableاول با جدول و مدل Tags شروع میکنم و با یک دستور هر دو اونهارو ایجاد میکنم:$ php artisan make:model Tag -mدستور بالا دو کلاس Tag.php (مدل) و create_tags_table.php (مایگریشن) ایجاد میشن.بعد میرم سراغ ایجاد جدول taggables :$ php artisan make:migration create_taggables_tableبا دستور بالا یک کلاس مایگریشن برای جدول tags ایجاد میشه تا بتونیم اون رو پیکر بندی کنیم.خب حالا بریم برای ایجاد جدول ها در فایل مایگریشن create_tags_table :create_tags_table migrationنکته مهم : حواستون باشه زمانی که از فیلد ها updated_at و created_at استفاده نمیکنیم باید پراپرتی $timestamps رو false قرار بدیم که به اررور پیدا نکردن این فیلد ها نخوریم.Tag model disable timestampsو بعد پیکر بندی جدول taggables :create_taggables_table migrationحالا بریم سراغ مدل هایی که میخوایم از تگ استفاده کنن و با جدول tags ارتباط داشته باشن، اینجا بیشتر با قدرت polymorphic در پکیج ORM لاراول آشنا میشیم.همونطور که ابتدا گفتم ما میخوایم فروشگاه ها و محصولات دارای تگ باشن تا بشه بهتر مدیریت و فیلترشون کرد، برای این منظور بجای ایجاد دو جدول shop_tags و product_tags ما میخوایم از یک جدول taggables برای هر جدولی که بخواد با tags ارتباط برقرار کنه خواهیم داشت که با اومدن فیلد های taggable_id و taggable_type این امکان پذیر میشه.سوالی که ممکنه پیش بیاد primary کردن سه فیلد tag_id و taggable_id و taggable_type هست و این برای این هست که اجازه ندیم تا تگ های تکراری به یک ردیف در یک جدول لینک بشن و اومدیم از بوجود اومدن duplication entry جلوگیری کردیم. (در واقع اجازه نمیدیم که یک فروشگاه از دو تگ تکراری استفاده کنه)بریم سراغ مدل Shop و یک متود جدید با نام tags بسازیم تا بتونیم تگ های هر فروشگاه رو براحتی بگیریم :Shop model using morphMany for tagsهمونطور که در تصویری بالا میبینید ما با استفاده از تگ morphToMany میتونیم از رابطه چند به چند در polymorphic استفاده کنیم.پارامتر هاش ممکنه یخورده گنگ به نظر برسه و با توجه به اینکه توو داکیومنت های لاراول این رو کامل توضیح نداده، من در عمل تستش کردم و کامنت هایی که میبینید جلوی هر پارامتر توسط خودم با بررسی هسته ORM لاراول نوشته شده.پارامتر اول نام کلاس مدلی هستش که قراره مدل ما باهاش ارتباط برقرار کنه و ازش استفاده کنه که اینجا Tag هستشپارامتر دوم نام پیشوند فیلدهایی هستش که در junction table قرار داره؛ که اینجا ما جدول taggables رو ساختیم و باید طوری این رو بسازید که با نام جدول هم خوانی داشته باشه، مثلا اگه اسم جدول ما taggables هست برای اینکه لاراول بتونه اسم جدول رو بدرستی حدس بزنه ما باید پسوند فیلد هارو taggable قرار بدیم در غیر اینصورت واجبه که پارامتر های بعدی رو پاس بدیم...پارامتر سوم نام جدول junction table هست که اختیاری هست به شرطی که پارامتر دوم درست داده بشه.پارامتر چهارم نام کلید خارجی مربوط به جدولی هست که میخواد با tags ارتباط برقرار کنه (اختیاری)پارامتر پنجم نام کلید خارجی هستش که به tags یعنی جدول نهایی که ما میخوایم بهش برسیم تعلق داره. (اختیاری)پارامتر ششم و هفتم هم کلید های اصلی هستن که مربوط به دو جدولی هستن که با هم ارتباط برقرار میکنن مثلا shops میخواد از tags استفاده کنه بنابراین نام کلید اصلی اونها id هست. (اختیاری)مهم : پارامتر هایی که اختیاری هستن به شرطی درست توسط پکیج ORM لاراول حدس زده میشه که شما طبق اصول این پکیج که در داکیومنتاش اومده جلو برید!متود morphToMany این کوئری رو اجرا میکنه :select * from `tags` inner join `taggables` on `tags`.`id` = `taggables`.`tag_id` where `taggables`.`taggable_id` = ? and `taggables`.`taggable_type` = ?
حالا همه چی آماده اس تا ما هر تگی که یک فروشگاه نیاز داره رو به اون بدیم.$shop = Shop::first() ;

$tag = new Tag;
$tag-&gt;name = &#039;Programming&#039;;
$tag-&gt;save();

$shop-&gt;tags()-&gt;attach($tag); 

$shop-&gt;tags;و به همین راحتی میتونیم در مدل های دیگه ای که میخوان از تگ استفاده کنن هم این رو داشته باشیم :Product model using morphToManyهمونطور که میبینید یه متود tags در مدل محصولات (Product) ایجاد کردم و با استفاده از متود morphToMany و پاس دادن فقط دو پارامتر میتونم از جدول tags در محصولات هم استفاده کنم.نحوه کارکردن با آبجکتی که morphToMany بر میگردونه دقیقا مثل رابطه چند به چند ساده اس که در بخش اول مقاله استفاده میکردیم و در داکیومنت های لاراول گفته شده و میتونیم از متود های sync, attach and detach استفاده کنیم :$product = Product::first();

$tags = Tag::insert([
[&#039;name&#039; =&gt; &#039;programming&#039;],
[&#039;name&#039; =&gt; &#039;games&#039;],
]);

$product-&gt;tags()-&gt;sync($tags);

$product-&gt;tags()-&gt;detach(Tag::first());

$product-&gt;tags;حالا چطور از طریق آبجکت تگ به محصولات یا فروشگاه هایی که از سیستم تگ استفاده کردن دسترسی داشته باشیم؟! با استفاده از متود morphedByMany در مدل Tag ما میتونیم تگ هایی که محصولات و فروشگاه های مختلف استفاده کردن رو بگیریم :Tag model using morphedByManyمتود morphedByMany این کوئری رو اجرا میکنه :select * from `products` inner join `taggables` on `products`.`id` = `taggables`.`taggable_id` where `taggables`.`tag_id` = ? and `taggables`.`taggable_type` = ?&amp;quotحالا براحتی میتونیم از طریق آبجکت tag به محصولات یا فروشگاه هایی که از اون تگ استفاده کردن دسترسی داشته باشیم، برای مثال ما میخوایم بدونیم چه فروشگاه هایی در حوزه programming محصول دارن و اون هارو میفروشن :$targetTag = Tag::whereName(&#039;programming&#039;)-&gt;first();
$targetTag-&gt;shops;به همین راحتی میتونیم فروشگاه هایی که از این تگ استفاده کردن رو بگیریم.جمع بندی...این سری از آموزش درباره رابطه ORM لاراول رو همینجا در بخش دوم این سری تموم میکنم، قطعا خیلی مسائل و امکانات بیشتری هست که میتونید در داکیومنت های لاراول پیدا کنید، در این دو بخش من خواستم فراتر از داکیومنت های لاراول پیش برم و باهم رابطه های مختلف موجود در پکیج فوق العاده قدرتمند ORM لاراول رو یاد بگیریم و بیشتر از اتفاقاتی که پشت صحنه میوفته آگاه باشیم.در پایان امیدوارم این مقاله براتون مفید بوده باشه و به احتمال زیاد بحث دیگه مربوط به همین سری رو در مقاله های مجزا مثل custom polymorphic types بنویسم.پیشنهاد من به شما اینه که برید و بیشتر هسته این پکیج جذاب رو نگاه کنید و البته میتونید با استفاده از متود toSql اتفاقاتی که در اجرای کوئری میوفته رو بررسی کنید.مرسی از همراهیتون،اگه دوست دارید مطالب بیشتری از من مطالعه کنید ویرگول، توییتر و لینکدین منو دنبال کنید.mdhesari.comtwitter.com/mdhesarihttps://www.linkedin.com/in/mohamad-fazel-hesari</description>
                <category>Mohamad</category>
                <author>Mohamad</author>
                <pubDate>Thu, 10 Sep 2020 22:51:18 +0430</pubDate>
            </item>
                    <item>
                <title>مشکلی احراز هویت و لاگین گیت در ویندوز Access denied</title>
                <link>https://virgool.io/coderlife/git-access-denied-problem-lsqucwmgzwro</link>
                <description>ممکنه برای شما هم پیش اومده باشه که در هنگام تعامل گیت و ریپازیتوری این اررور برای شما بوجود بیاد.remote: HTTP Basic : Access denied
fatal: Authentication failed for &#039;https://gitlab.com/Mdhesari/myTestRepo.gitاین مشکل به این معنیه که اطلاعات حساب کاربری شما در سایتی که مخزنتون قرار داره مثل گیت لب یا گیت هاب صحیح وارد نشده.شما چندتا راه برای حل این موضوع دارین که من راه ساده تر و بهترش رو توو چند جمله بهتون میگم.در کنترل پنل ویندوز یک بخشی وجود داره به اسم  Credential Manager که میتونید اطلاعات محرمانه ای که برای ورود به سایت ها و برنامه های مختلف استفاده میکنید و قبلا وارد کردید رو مدیریت کنید.برای ورود به این بخش یا میتونید در قسمت جستجو Credential Manager رو سرچ کنید و یا در کنترل پنل &gt; آیتم User Accounts &gt; با کلیک روی Credential Manager این کنسول رو باز کنید.Credential Managerهمونطور که مشاهده میکنید در قسمت Generic Credentials سایت هایی که من اطلاعات حساب کاربری وارد کردم اونجا ذخیره شده و میتونیم به راحتی حذفشون کنیم.بعد از حذف سایت مورد نظر حالا میتونید از همونجا یه حساب جدید یا برگردید به ترمینال و فعالیت مورد نظرتون رو انجام بدین مثلا clone, pull, push etc بعد از درخواست یه پنجره باز میشه که از شما اطلاعات یوزر و پسوردتون رو میگیره.راه های دیگه ای هم وجود داره و اما من به همین راه حل بسنده کردم، امیدوارم که کمکتون کنه، اگر سوالی داشتین در کامنت ها حتما بپرسید. موفق باشید.</description>
                <category>Mohamad</category>
                <author>Mohamad</author>
                <pubDate>Mon, 15 Jun 2020 16:37:26 +0430</pubDate>
            </item>
                    <item>
                <title>درک روابط دیتابیس در پکیج ORM لاراول با تحلیل پروژه واقعی!</title>
                <link>https://virgool.io/@Mdhesari/%D8%B1%D9%88%D8%A7%D8%A8%D8%B7-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-rhu8vmlcbeaj</link>
                <description>gliacoding.comخب این پست رو مینویسم برای بیشتر یادگرفتن خودم و همینطور کمک به اونایی که برای درک روابط بین جدول های دیتابیس در لاراول یا هر فریم ورک دیگه ای مشکل دارن!این پست مخصوصا برای لاراول کارا نوشته شده، اما میتونه برای هر کسی مفید باشه و حتی کسایی که با زبان های دیگه ای کار میکنن هم به دردشون میخوره.اول از همه بریم سراغ شناخت انواع روابط یا Relationship در پایگاه داده.انواع روابط در پایگاه دادهما میتونیم انواع رابطه ها رو داشته باشیم، بیاید از خودمون شروع کنیم : بین شما و پدر و مادرتون یک رابطه یک به یک وجود داره، بین شما و دوستانتون میتونه یک رابطه یک به چند وجود داشته باشه و بین اعضای دو گروه میشه یک رابطه چند به چند رو در نظر گرفت.اینا همش یه مثاله و حتی بعضیاش میتونه دقیقا درست نباشه اما مارو به چیزی که میخوایم یاد بگیریم نزدیک میکنه. خب ما همین روابط رو برای مدیریت بهتر جدول هامون در دیتابیس داریم و خیلی عالین، مثلا همین مقاله ای که دارم مینویسم در ویرگول از دو تا جدول users و posts استفاده میکنه و بین این دو یک رابطه یک به چند وجود داره، منه نوعی که دارم این پست رو مینویسم امکان داره چندین پست دیگه هم بنویسم در آینده و البته قبلا هم نوشته باشم.حالا که خوب روابط رو درک کردیم و من انتظار دارم دانش کافی برای کار با روابط در دیتابیس رو دارین، حالا بریم سراغ لاراول و اینکه چقدر کار با دیتابیس در لاراول راحت و جذاب انجام میشه.اگر در درک روابط ساده دیتابیس مشکل دارین این منابع بهتون کمک میکنه یاد بگیرید :انواع رابطه میان جدول ها در پایگاه داده رابطه ایمفهوم پایگاه داده رابطه ای relational databaseروابطی که در مقاله اول این سری آموزش یاد میگیریم : یک به یک ( one-to-one )یک به چند ( one-to-many )چند به چند ( many-to-many )برای درک بهتر ما از یک پروژه فرضی استفاده و انواع روابط رو در این پروژه بررسی میکنیم.برای مثال در نظر بگیرید، ما یک پلتفرمی ساده مارکت پلیس رو داریم که این امکان رو به فروشنده ها میده تا با افراد مختلف تعامل داشته باشن و محصولاتشون رو بصورت عمده یا تکی به فروش بذارن.برای شروع کار من یک پروژه جدید لاراول با استفاده از پکیج منیجر کامپوزر با نام TopSeller ایجاد میکنم.composer create-project --prefer-dist laravel/laravel TopSellerحالا بریم سراغ تحلیل پروژه و قبل از هر چیزی دیاگرام جدول هامون رو رسم میکنیم تا یک دید کلی از نحوه کارکرد پروژه ساده مون داشته باشیم.برای رسم دیاگرام ابزار های زیاد و متنوعی وجود داره مثل draw.ioمن از پلاگین جدید draw io در vscode استفاده میکنم که فوق العاده عالیه و اگر vscode دارین حتما نصب کنید. این پلاگین با ارتباط با وبسایت Draw.io این امکان رو فراهم میکنه تا توو همون vscode دیاگرام هامون رو رسم کنیم.Draw.io Integration vscode plugin دیاگرام موجودیت های دیتابیس پروژهدر پروژه ما برای شروع MVP میتونیم 7 جدول داشته باشیم که روال کار رو بصورت ساده انجام بدیم.users (کاربران)shops (فروشگاه ها)shops_setting (تنظیمات بیشتر فروشگاه ها)products (محصولات)carts (سبد های خرید)invoices (صورت حساب ها)cart_product (جدول رابط محصولات با سبد های خرید)اگر دقت کرده باشید، ما پلتفرمی رو داریم که هر کاربر میتونه یک یا چند فروشگاه با محصولات متنوع و مختلف داشته باشه. سبد های خرید رو داریم که یک رابطه چند به چند رو با محصولات برقرار میکنه، که در ادامه درباره همه اینها صحبت و تحلیل میکنیم.رابطه یک به یک (one to one) رابطه یک به یک همونطور که از نامش پیداست، یعنی بین دو رکورد در دو جدول مختلف تنها یک رابطه میتونه وجود داشته باشه یا اصلا هیچ رابطه ای نباشه.در پروژه ما هر کاربر فقط میتونه یک سبد خرید داشته باشه یا میتونه هیچ سبد خریدی نداشته باشه و صرفا یه فروشنده باشه.users and carts table diagramپس ما برای دریافت سبد خرید یک کاربر در مدل یوزر متود cart رو خواهیم داشت :User Model Class در پکیج ORM لاراول واقع در کلاس بیس مدل، میتونیم با استفاده از متود hasOne رابطه یک به یک رو داشته باشیم.متود hasOne کوئری زیر رو در دیتابیس اجرا میکنه :SELECT * FROM `carts` WHERE `carts`.`user_id` = ? AND `carts`.`user_id` IS NOT NULLحالا اگر بخوایم در برناممون سبد خرید کاربر رو بگیریم :$user = User::find(1);

$user-&gt;cart;در اینجا در پارامتر اول آدرس کلاس مدلی که جدول ما باهاش ارتباط داره رو قرار میدیم که برای جلوگیری از تکرار از property استاتیک class:: استفاده میکنیم.در پارامتر دوم foreign_key یا کلید خارجی جدولمون که در جدول مورد نظر قرار داره رو وارد میکنیم که برابر با user_id هستش.در پارامتر سوم local_key یا کلید داخلی یا همون primary_key که به جدول کنونی خودمون (Users) مربوط میشه وارد میکنیم.اگر توجه کرده باشید ما همه کلید های داخلیمون برابر با id هست و کلید های خارجی هم بطور اتوماتیک توسط پکیج ORM شناسایی میشه پس اگر طبق اصول همیشگی پیش بریم که لاراول در داکیومنت هاش معرفی کرده نیازی به وارد کردن اینها نیست.درباره نحوه کارکرد الگوریتم پکیج ORM لاراول، آخر مقاله در قسمت رابطه چند به چند کارکرد این الگوریتم رو شرح دادم.حالا اگر بخوایم از مدل سبد خرید به صاحب دسترسی داشته باشیم از همین متود استفاده میکنیم (در مدل Cart) :Cart Model Classاصلاح (آپدیت 98.6.10) : در تصویر بالا بجای متود hasOne باید از متود belongsTo استفاده بشه.دسترسی از طریق سبد خرید به کاربر در برنامه هم مثل همیشگیه، در واقع این مربوط به همه روابط میشه و به همین سادگی میتونیم اطلاعات رکورد رابطمون رو داشته باشیم :$cart= Cart::find(1);

$cart-&gt;user;رابطه یک به چند (one to many)این رابطه یکی از پر استفاده ترین و پر کاربرد ترین روابط دیتابیسه، در رابطه یک به چند، یک رکورد میتونه با چندین رکورد در ارتباط باشه و هیچ محدودیتی برای رابطه بین رکورد ها نداره. در پروژه ما چندین رابطه یک به چند میتونه وجود داشته باشه.برای مثال در پروژه ما یک فروشگاه میتونه چندین محصول داشته باشه و این یک رابطه یک به چنده، پس بریم برای پیاده سازی گرفتن محصولات یک فروشگاه در مدل Shop :Shop Model Classهمونطور که مشاهده میکنید ما از متود hasMany لاراول میتونیم رابطه یک به چند رو داشته باشیم و همه محصولات متعلق به یک فروشگاه توسط این متود داده خواهد شد.$shop = Shop::find(1);

$shop-&gt;products;در پارامتر های دوم و سوم hasMany میتونیم کلید خارجی و داخلی رو هم مشخص کنیم که قبل تر درباره اش صحبت کردیم.متود hasMany کوئری زیر رو در دیتابیس اجرا میکنه :SELECT * FROM `products` WHERE `products`.`shop_id` = ? AND `products`.`shop_id` IS NOT NULLاما کار با رابطه ها اینجا ختم نمیشه و میتونیم کارهای جذاب دیگه ای هم انجام بدیم.مثلا اگر بخواهیم بعد از گرفتن محصولات یه فروشگاه یه سری فیلتر های دیگه مثل گرفتن قیمت های بیشتر ۱۰۰۰ رو بگیریم به این صورت عمل میکنیم :$cart-&gt;products()-&gt;where(&#039;price&#039;,&#039;&gt;&#039;,1000)-&gt;get();حالا چطور میتونیم برعکس فرآیند قبل از طریق یک محصول به فروشگاهش دسترسی داشته باشیم؟ با متود belongsTo خیلی راحت میشه این کار رو انجام داد، پس در مدل Prodcut داریم :Product Model Classمتود belongsTo فروشگاهی رو برمیکردنه که یک محصول به اون تعلق داره و این کوئری در دیتابیس اجرا میشه :SELECT * FROM `shops` WHERE `shops`.`id` = ?رابطه چند به چندبسیار خوب حالا میرسیم به قسمت جذاب و البته پیچیده تر ماجرا، جایی که رکورد ها میتونن با چندین رکورد مختلف ارتباط داشته باشن. این در پروژه ما مربوط به سبد خرید کاربر و محصولات ما میشه.محصولات میتونن به چند سبد خرید لینک بشن و همچنین سبد های خرید میتونن چندین محصول رو داشته باشن، اینجاست که به پیچیدگی ماجرا نزدیک میشیم اما اگر خوب درک کنیم خیلی ساده میشه. زمانی که کاربر محصولی رو انتخاب میکنه، ما برای ذخیره سازی انتخاب کاربر در سبد خرید به دو تا نکته باید توجه کنیم :چه کسی خرید رو انجام داده؟چه محصولی انتخاب شده و به چه تعداد؟حالا به این شکل دیاگرام جدول هامون طراحی میکنیم :دیاگرام جدول سبد های خرید و محصولامهم ترین جدول ما، جدول cart_product هست که رابطه چند به چند رو در سبد خرید و محصولات ایجاد میکنه.این جدول با استفاده از دو کلید خارجی cart_id و product_id این دو جدول رو به همدیگه وصل میکنه. quantity هم تعداد محصولاتیه که مشتری درخواست میکنه.حالا ما مدل های Product و Cart رو داریم و میخوایم جدول رابط cart_product رو در دیتابیس وب اپلیکیشن لاراولیمون ایجاد کنیم. ابتدا فایل migration این جدول رو میسازیم :php artisan make:migration create_cart_product_tableبا این دستور فایل زیر ایجاد میشه و ما طبق دیاگراممون عمل میکنیم :cart_product Tableحالا که جدولمون را با استفاده از دستور زیر در دیتابیس ساختیم، وقتشه که اصل کار رو در Model هامون پیاده سازی کنیم.php artisan migrateبریم سراغ مدل Cart و متد گرفتن محصولات لینک شده رو بسازیم :Cart Model Classما برای گرفتن رکورد ها در رابطه چند به چند در لاراول از متود belongsToMany استفاده میکنیم.در پارامتر اول آدرس کلاس مدل مورد نظر رو میدیم که قبلا درباره اش صحبت کردیم.پارامتر دوم مربوط به اسم جدول رابطمون میشه که قبلا باهم ساختیم یعنی cart_product.پارامتر سوم مربوط به نام کلید خارجی مدل اصلیمون یعنی Cart هستش.پارامتر چهارم مربوط به نام کلید خارجی مدلی هستش که Cart باهاش رابطه داره یعنی Product.متود belongsToMany این کوئری رو در مدل Cart ما برای پیدا کردن محصولات اجرا میکنه :select * from `products` inner join `cart_product` on `products`.`id` = `cart_product`.`product_id` where `cart_product`.`cart_id` = ?حالا نحوه دسترسی به محصولات در کد ها هم به سادگی خواهد بود :$cart = Cart::find(1); 

$cart-&gt;products;اگر بخوایم رکورد های جدید بین دو جدول ایجاد و یا حذف کنیم  خیلی راحت میتونیم از سه متود attach, detach, sync استفاده کنیم که هر کدومشون رو الان بررسی میکنیم.متود پیوست (attach)در این متود ما میتونیم یک محصول جدید رو وارد سبد خرید کنیم، به این شکل عمل میکنیم :$cart-&gt;products()-&gt;attach([
1 =&gt; [&#039;quantity&#039; =&gt; 1],
2 =&gt; [&#039;quantity&#039; =&gt; 2],
]);همونطور که مشاهده میکنید ما به متود attach یک آرایه دو بعدی رو پاس دادیم.در بعد اول آرایه ایندکس که داده شده یعنی 1=&gt; مربوط به آیدی منحصر بفرد محصول میشه و آرایه ای که درونش داره اطلاعات اضافه ای هستش که در جدول رابطمون مشخص کردیم که ما یدونه بیشتر نداریم و اون تعداد محصولاتمون (quantity) هستش.متود جدا کردن (detach) نحوه کار با این متود هم دقیقا مثل متود قبلی یعنی attach هست اما فرقشون اینه که detach بجای اضافه کردن رکورد رو در صورت وجود حذف میکنه. مثل زمانی میمونه که کاربر از خرید یه محصول منصرف میشه و اون رو لغو میکنه.$cart-&gt;products()-&gt;detach([
1,
2,
3
]);متود همگام سازی (sync)بعضی وقتا هست که ما میخوایم یک سری محصول رو وارد سبد خرید میکنیم و هر چیز دیگه ای که قبلا در سبد خرید بود حذف بشه، متود sync اینجا به کمکمون میاد :$cart-&gt;products()-&gt;sync([
1 =&gt; [&#039;quantity&#039; =&gt; 3],
2,
3
]);برای داشتن فرآیند مشابه در مدل Product هم چنین چیزی رو خواهیم داشت :Product Model Classمتود carts تمام سبد های خریدی که محصول مشخصی رو درونشون دارن برمیگردونه.$product = Product::find(1);

$product-&gt;carts; // تمام سبد های خرید که دارای این محصول هستن داده میشه.اگر دقت کرده باشین، در مدل Product دیگه پارامتر های دوم تا چهارم رو پر نکردم و اجازه دادم لاراول بصورت اتوماتیک اینکار رو انجام بده؛ اما باید حواسمون باشه که طبق اصول و الگوریتم لاراول هم باید پیش بریم.شرح نحوه کارکرد الگوریتم لاراول در تشخیص نام جدول هاالگوریتم لاراول به این صورت کار میکنه که اسم جدول رابط رو طبق حروف الفبای انگلیسی ABCD... پیدا میکنه.ما چون طبق اصول پیش رفتیم و جدول رابطمون رو به همین شکل ساختیم پس مشکلی نخواهیم داشت چون پکیج ORM میدونه که بین دو جدول carts و products با توجه به حروف الفبا carts چون با c شروع میشه پس نسبت به products که با p شروع میشه ارجحیت داره. بعد از تشخیص ارجحیت ها، حالا نوبت برداشتن s و جمع نام جدول هاست، یعنی carts میشه cart و نهایتا ما اسم cart_product رو خواهیم داشت. (خیلی ساده و زیبا)تا اینجا الگوریتم تشخیص نام جداول رو هم یاد گرفتیم؛ حالا چطوری میتونیم به جدول واسط در هنگام استفاده از رابطه چند به چند دسترسی داشته باشیم؟برای دسترسی به جدول رابط، لاراول به طور پیش فرض اسم این جدول هارو pivot گذاشته و شما میتونین در آبجکت رابطتون بهش دسترسی داشته باشین. فرآیند زیر رو در نظر داشته باشید :$product = Product::find(1);

foreach($product-&gt;carts as $cart) { 
$cart-&gt;pivot; 
/*
[
cart_id =&gt; 1,
product_id =&gt; 1,
]
*/
}همونطور که میبینید pivot بطور پیش فرض فقط دو تا ستون دو مدل رو برمیگردونه و ما به quantity یا تعداد محصولاتی که انتخاب شده دسترسی نداریم. برای اینکه به این هم دسترسی داشته باشیم در مدل Product از  متود withPivot استفاده میکنیم :return $this-&gt;belongsToMany(Cart::class)-&gt;withPivot(&#039;quantity&#039;);حالا اگه اسم pivot خیلی برامون جالب نباشه میتونیم با استفاده از متود as براش اسم هم در نظر بگیریم :return $this-&gt;belongsToMany(Cart::class)-&gt;as(&#039;cart_info&#039;);فیلتر کردن بر اساس اطلاعات جدول رابطحالا اگر بخوایم محصولات یک سبد خریدی رو بگیریم که بیشتر از 3 تعداد خواسته شده باید چیکار بکنیم؟بعد از صدا زدن متود belongsToMany ما متود های دیگه ای هم داریم که یکیش رو بالاتر معرفی کردم و این ها مربوط به فیلتر اطلاعات در زمان اجرای کوئری دیتابیس هستش.wherePivot(&#x27;quantity&#x27;,1)wherePivotIn(&#x27;quantity&#x27;,[1,2])wherePivotNotIn(&#x27;quantity&#x27;,[3,4])حالا اگر بخواهیم محصولاتی که بیشتر از 3 تعداد در یک سبد خرید درخواست شدن رو بگیریم به این شکل عمل میکنیم :return $this-&gt;belongsToMany(Product::class)-&gt;wherePivot(&#039;quantity&#039;,&#039;&gt;&#039;,3);با توجه به طولانی شدن مقاله، تصمیم گرفتم دو تا تاپیک مربوط به روابط دیتابیس بعدی و مهم دیگه در لاراول رو تو مقاله دوم بذارم که به زودی به اشتراک گذاشته میشه :Has One ThroughPolymorphicدر آخر...قطعا اطلاعات این مقاله کامل نیست و ممکنه یک سری مشکلات هم داشته باشه، اما تا حد امکان سعی شده از اشتباهات جلوگیری بشه.برای اطلاعات بیشتر خوندن داکیومنت های لاراول بسیار توصیه میشه تا با امکانات و متود های دیگه که استفاده کمتری دارن هم آشنا بشین.اگر ایراداتی در این مقاله هست عذرخواهی میکنم و با کمال میل پذیرای انتقادات عزیزان هستم ;)</description>
                <category>Mohamad</category>
                <author>Mohamad</author>
                <pubDate>Thu, 21 May 2020 17:50:13 +0430</pubDate>
            </item>
                    <item>
                <title>مفهوم Event Bubbling در جاوا اسکریپت</title>
                <link>https://virgool.io/@Mdhesari/event-bubbling-in-javascript-b8yco0eftmyb</link>
                <description>حبابی از رویداد ها در جاوا اسکریپت، مفهومیه که وقتی شما چندین رویداد رو برای انواع مختلف از المنت هاتون ست میکنید، اگر دو المنت پدر و فرزند رو براشون یک رویداد مشابه تعریف کنید که کار متفاوتی رو انجام میدن حبابی از رویداد ها رخ میده که ممکنه باعث بوجود اومدن مشکلاتی در وبسایتتون بشه  برای مثال در نظر داشته باشین که ما دو المنت فرزند و پدر باتن و دیو رو کنار هم داریم. اگر برای هردوشون دوتا رویداد کلیک تعریف کنیم که کار متفاوتی رو انجام میدن و در صورتی که کاربری روی دکمه کلیک کنه رویداد ابتدا برای دکمه و سپس در دیو پدیدار میشه.  برای جلوگیری از این موضوع، پارامتر پاس داده شده به تابع رویدادمون یک متودی داره که میتونه این کار رو برای ما انجام بده  e =&gt; { e.stopPropagation() }  برای درک بیشتر تصویر زیر رو مشاهده کنید.  همچنین ما میتونیم بجای مفهوم  Event Bubbling (حبابی از رویداد ها)، Event Capturing رو داشته باشیم.  این نوع از رویداد ها در واقع بالعکس حبابی از رویداد ها عمل میکنه و بجای ورود از فرزند از پدر رویداد ها پدیدار میشه.  مثلا شما اگه روی باتن کلیک کنید، ابتدا روی دیو اعمال میشه و سپس روی باتن.  در پست های بعدی حتما مثال این نوع از رویداد هارو خواهم زد.</description>
                <category>Mohamad</category>
                <author>Mohamad</author>
                <pubDate>Tue, 05 May 2020 00:11:53 +0430</pubDate>
            </item>
                    <item>
                <title>4 عادت بد که شمارو تبدیل به یک توسعه دهنده ناکارآمد میکنه!</title>
                <link>https://virgool.io/@Mdhesari/4-%D8%B9%D8%A7%D8%AF%D8%AA-%D8%A8%D8%AF-%DA%A9%D9%87-%D8%B4%D9%85%D8%A7%D8%B1%D9%88-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%A8%D9%87-%DB%8C%DA%A9-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D8%AF%D9%87%D9%86%D8%AF%D9%87-%D9%86%D8%A7%DA%A9%D8%A7%D8%B1%D8%A2%D9%85%D8%AF-%D9%85%DB%8C%DA%A9%D9%86%D9%87-bsucubhwfxiu</link>
                <description>اگه برنامه نویس یا توسعه دهنده هستید، پیشنهاد میکنم حتما این مقاله رو بخونید چون واقعا خودم هم درگیرش بودم و این مشکلات رو داشتم.ما به عنوان برنامه نویس و توسعه دهنده ممکنه عادت هایی رو داشته باشیم که در آینده مشکلات بزرگی رو برامون درست کنه و باید از وقوع چنین حادثه هایی جلوگیری کنیم!&quot;عادت های شما، آینده شما رو شکل میدن&quot; - جک کانفیلدنداشتن جرئت نه گفتن!بعضی وقتا پیش میاد که حاضریم هر کاری بکنیم ولی به طرف مقابلمون نه نگیم یا به هر ایده ای که توو سرمون میزنه نه نگیم و متمرکز روی یک ایده و کار نباشیم! موافق بودن و مثبت بودن با همه چیز بهره وری مارو به شدت کاهش میده و در نتیجه باعث کم انگیزه تر شدن ما در طول روز میشه.اما منظور من از نه گفتن، کمک نکردن بقیه برنامه نویس ها نیست! اما خودتون میدونید و تجربه اش رو هم شاید داشته باشید که بعضیا خیلی بیش از حد سوال میپرسن، مخصوصا اگه بدونن تو یه چی حالیته! حالا اینا هر چی به سرشون برسه میان از تو میپرسن.پالو کویئلیو میگه :  When you say “yes” to others, make sure you are not saying “no” to yourself. Paulo Coelhoترجمه : وقتی به همه بله میگید و توانایی نه گفتن ندارید، مواظب باشید که اون رو به خودتون و کارهاتون نگفته باشید.اگه صراحتا به شخص مقابلتون بگید که کار دارید و زمانتون محدوده، اونوقت حساب کار دستشون میاد و میدونن که هر زمانی که شد نباید بپرن وسط کارتون و تمرکز شما رو بهم بزنن.به اونها بگید که اگر سوالی دارن تووی تایم استراحت و زمان مشخصی به شما مراجعه کنن و مشکلاتشون رو درمیون بذارن.این باعث میشه نه تنها خودشون برن دنبال جواب و سعی کنن که پیداش کنن، بلکه باعث میشه زمان الکی برای مشکلای کوچیک هدر نره و در نهایت هم اگر نتونستن مشکلشون رو حل کنن، لیستش میکنن و توی فرصت مناسب با شما یا شخص با تجربه تر دیگه ای حلش میکنن.یه پیشنهاد اینه که توو گوشتون هدفون یا هندزفری بذارید تا دیگه کسی مزاحمتون نشه، چون شما دیگه صدای اطراف رو نمیشنوید و بقیه هم سعی میکنن کمتر با شما کار داشته باشن...مطمئن نبودن به زمان پایان پروژه!معمولا &quot;به انجام رساندن&quot; کار توسط توسعه دهنده ها با &quot;به انجام رساندن&quot; کار با مردم عادی فرق میکنه، اونا هزارتا کار دیگه هم باید بعد از تموم شدن کارشون انجام بدن و شایدم خیلی بیشتر؛ چون هنوز مطمئن به پایان پروژه نیستن!وقتی فکر میکنید که کارتون تموم شده، این فاکتور هارو حتما در نظر بگیرید :آیا کدتون رو اصلاح یا Refactor کردید؟ یه نگاه و مرور کلی به کدتون کنید و مطئمن بشید برای بقیه توسعه دهنده ها هم قابل فهمه، در غیر اینصورت حتما برید و درستش کنید.این خیلی مهمه که کدتون رو اصلاح کنید و مشکلات خواناییش رو رفع کنید، نه فقط برای محض رضای خدا و کمک به توسعه دهنده های دیگه، این کار برای خودتون مفیده که وقتی دو سه ماه دیگه یه سری به کداتون زدید، فکر فرار به سرتون نزنه!نوشتن مستندات یکی از مهم ترین کاراییه که باید آخر پروژه و حتی در زمان توسعه نوشته بشه.تا جایی که میتونید کد رو تمیز نگهدارید و داکیومنت مناسبی رو براش تا آخر بنویسید.تست نکردن کدقطعا کلمه تست، برای توسعه دهنده ها محبوب نیست! بعضیا کلا دوست ندارن تست کنن و بعضیا هم بخاطر تنبلی از این کار جلوگیری میکنن و اینکارو نمیکنن...این بدترین عادتیه که بیشتر دولوپر ها با اون سروکله میزنن، فکر میکنیم با تست نکردن کد زمان زیادی رو میخریم و میتونیم روی امکانات دیگه پروژه بیشتر وقت بذاریم؛ در حالی که کاملا برعکسه!اولا که اگر در کمپانی های بزرگی مشغول به کار باشید، قطعا یه تستر دارید و میتونه در عرض چند دقیقه چندتا باگ پیدا کنه و شما مجبورین با ناامیدی دوباره روی همون بخش کار کنید و زمان زیادی رو در نتیجه از دست بدین؛ نه تنها زمان شما گرفته میشه بلکه زمان تستر هم بابت این باگ ها گرفته میشه و دوباره مجبوره بعد از اصلاح دوم توسط شما تست های بعدی انجام بشه و اگه باز هم کدتون رو خودتون تست نکرده باشید این رویه تکرار میشه و ممکنه شرکت از شما نا امید بشه در نهایت کارتون رو از دست بدین...پس میبینید که تست نکردن حتی میتونه چند برابر بهره وری شمارو کاهش بده... پس تست کردن رو در الویت کار هاتون قرار بدین و اون رو از همون اوایل پروژه جدی بگیرید.درباره نحوه تست اصولی در اینترنت بیشتر بخونید و با TDD هم آشنا بشید.کامیت های ناکارآمد و بزرگ!اگه یک توسعه دهنده متوسط رو به بالا هستید پس حتما با گیت آشنایی دارید و کار کردید، اگر هم تجربه کار با گیت رو ندارید چندتا لینک میزارم که میتونه توضیح و آموزش های مناسبی براتون باشه (آخر مقاله).یکی از مرسوم ترین عادت های بد توسعه دهنده ها کار کردن غیر اصولی با گیت و کامیت های بیش از حد بزرگ اونهاست که دقیقا هدف اونها از هر کامیت مشخص نیست؛ کلی از کدها تغییر کرده و اصلا معلوم نیست چی تغییر داده شده!چه حسی بهمون دست میده وقتی میخوایم کامیت یه برنچ رو مرور کنیم که صدها تغییر داره و توسعه دهنده با یک پیغام &quot;fix some bugs&quot; به اون خاتمه داده؟ قطعا برای ادامه دلسرد و بی انگیزه میشیم...کامیت های کوتاه بسیار عالی و کارآمد هستن و همچنین باعث میشه پیام های مناسبی و واضحی رو براشون تعریف کنیم، مرور کردن کد فوق العاده آسون میشه و کیفیت کد شما بالا میره؛ توسعه دهنده های دیگه و خود شما برای دیباگ در آینده مشکلی نخواهید داشت؛ خلاصه کامیت های کوتاه و واضح دوست واقعی شما هستن که میتونن هر لحظه باعث نجاتتون باشن.ممنونم از وقتی که گذاشتید و امیدوارم این مقاله براتون مفید بوده باشه :)چنتا منبع خوب برای آشنایی با گیت و گیت هاب :zoomit, roocket, english resources...</description>
                <category>Mohamad</category>
                <author>Mohamad</author>
                <pubDate>Thu, 09 Jan 2020 02:31:33 +0330</pubDate>
            </item>
                    <item>
                <title>واسه ساختن ایده؟ نه اینجا امن نیست...</title>
                <link>https://virgool.io/@Mdhesari/%D9%88%D8%A7%D8%B3%D9%87-%D8%B3%D8%A7%D8%AE%D8%AA%D9%86-%D8%A7%DB%8C%D8%AF%D9%87-%D9%86%D9%87-%D8%A7%DB%8C%D9%86%D8%AC%D8%A7-%D8%A7%D9%85%D9%86-%D9%86%DB%8C%D8%B3%D8%AA-r4qnwxkgugdb</link>
                <description>فقط صبر میکنم و سعی میکنم با شرایط کنار بیام، شاید اسمشو بذاریم فرصت اما بهتره خودمونو گول نزنیم، این اسمش خوردن حقه! این حقه منه که با جهان ارتباط داشته باشم و تویی که ادعا میکنی اسلامی هستی و دین محمد (ص) رو توو کشور پیاده میکنی، کوووو؟ به خدا اسلام اینطوری نیست، قرآن اینطوری نیست.امیدوارم کشورم حالش خوب بشه، نه اینکه هر روز بدتر با جوونای نا امیدتر از دیروز...</description>
                <category>Mohamad</category>
                <author>Mohamad</author>
                <pubDate>Tue, 19 Nov 2019 00:02:35 +0330</pubDate>
            </item>
                    <item>
                <title>فرار از دیوار بدبختی، تغییر برای زندگی بهتر...</title>
                <link>https://virgool.io/@Mdhesari/%D9%81%D8%B1%D8%A7%D8%B1-%D8%A7%D8%B2-%D8%AF%DB%8C%D9%88%D8%A7%D8%B1-%D8%A8%D8%AF%D8%A8%D8%AE%D8%AA%DB%8C-%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B2%D9%86%D8%AF%DA%AF%DB%8C-%D8%A8%D9%87%D8%AA%D8%B1-cm7q9zxqaqeg</link>
                <description>چند ماهی میگذرد، شک میکنم آیا راهی که در پیش گرفته ام ارزش رفتن را دارد یا خیر! گاهی اوقات شک میکنم اما این را میدانم که من با نیت خیر پا به این راه گذاشته ام؛ به خدای خودم و توانایی هایم ایمان دارم.تردیدی در آینده ای روشن و فوق العاده برای خودم و کشور خودم ندارم.در این فکر بوده ام که آیا بگذرم یا بمانم و همچنان در این فکر سیر کرده ام.من بی شک اشتباهات زیادی را مرتکب شده ام که هریک به وضوح برای من پیامی دارد. دوستانی را اندوهگین کرده ام که واقعا قصدش را نداشتم... چیزی نماند جز شرمنده گی...از یکی دو روز آینده خود شاید حالا خبر نداشته باشم اما از 5 سال، 10 سال و 15 سال آینده ام میتوانم چیزهایی را پیش بینی کنم؛ باید بدانم حالا باید چکار کنم تا به هدف طلایی خود دست یابم...روز ها مثل برق و باد میگذرند و من نمیتوانم دست روی دست بگذارم، میگویند حالا جوانی و وقت داری اما نمیدانند خودشان هم روزی جوان بوده اند و چگونه فرصت ها را از دست داده اند...نداشتن هدف و مقصد مشخص برای من بسیار آزار دهنده است و گاهی آنقدر عذاب آور میشود که همه چیز را از اول شروع میکنم تا بالاخره خودم را پیدا کنم.پروژه های معدودی را نیمه کاره رها کرده ام تا بعد از ساختن خودم و پیشرفت بیشتر سراغ انتهای آنها بروم اما این کار درست نبود و باید تا انتها پیش میرفتم، با این حال به خودم برای دیگر پروژه های کوچک و بزرگ که موفق شدم به خوبی به پایان برسانم افتخار میکنم؛ توانستم به ترسم غلبه کنم و علارغم سختی و بی تجربگی کار های بزرگ را قبول کردم و سراغ یادگیری تمامی موارد مورد نیاز شتافتم.میشوم همان محمد فاضلی که کارآفرینی را دوست دارد و درباره اهداف و رویاهایش لجباز است و از خوبی و بدیهای زندگی لذت میبرد؛ همان شخصی که کوچک و بزرگ، پیر و جوان، ثروتمند و فقیر فرقی ندارد، با احترام رفتار میکند و میخواهد پاره ای از پیشرفت مملکتش باشد.تصمیم گرفته ام حتی اگر کاری نفرت انگیز را انجام میدهم از سر تا سر این فرایند لذت ببرم و زندگی را سخت نگیرم و از این خوشحالم که دیر به این نتیجه نرسیده ام؛ تجربه افراد بزرگ برای من بسیار حائز اهمیت است، از حالا قدر انسان های خوب و کتاب های خوب را میدانم.</description>
                <category>Mohamad</category>
                <author>Mohamad</author>
                <pubDate>Sun, 27 Oct 2019 14:46:24 +0330</pubDate>
            </item>
                    <item>
                <title>اون مارو به هم میرسونه...</title>
                <link>https://virgool.io/@Mdhesari/they-will-get-us-nf6fvjxnyvnn</link>
                <description> آدمها رو ذخیره نکنیم برای روزهای مبادااگر برای کسی نصفه و نیمه ایمو او تمامش را برایمان خرج میکند تووی آب نمک نخوابانیمش هی بگوییم اگر هیچکس نباشداین آدم هست که تمامِ خودش را پای من میگذارد آدمها یک روز ته می‌کشندبی اینکه بفهمیدو زمانی به خودتان می‌آید کهدیگر هیچ راهی برای بازگرداندن آدمی نیستکه احساسش را صادقانه خرجتان کرده بود … </description>
                <category>Mohamad</category>
                <author>Mohamad</author>
                <pubDate>Wed, 15 Aug 2018 17:40:31 +0430</pubDate>
            </item>
            </channel>
</rss>