<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های حسین غلامیان</title>
        <link>https://virgool.io/feed/@hosseingholamian</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-16 18:33:42</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1627679/avatar/DtX0Bc.jpeg?height=120&amp;width=120</url>
            <title>حسین غلامیان</title>
            <link>https://virgool.io/@hosseingholamian</link>
        </image>

                    <item>
                <title>Accessors &amp; Mutators &amp; casts در لاراول</title>
                <link>https://virgool.io/@hosseingholamian/accessors-mutators-casts-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-rrntppbq1ppk</link>
                <description>در لاراول Accessor ها مقادیر خروجی از دیتابیس را میتوانند تغییر دهند و  برعکس Mutators ها مقادیری که میخواهند در دیتا بیس سیو شوند را تغییر میدهند برای درک بهتر به مثال زیر توجه کنیدفرض کنید اسم تمام کاربران شما در دیتا بیس با حرف کوچک ثبت شده باشد برای مثال nima و ali و غیره ولی شما نیاز دارید در تمام view هایتان نام کاربران برا با حرف اول بزرگ نمایش دهید یا اینکه شما لازم دارید که موقع ثبت کردن اسم کاربران در سایت حرف اول همه کوچک یا بزرگ شود این کار در لاراول با استفاده از Accessors و Mutators به راحتی امکان پذیر است برای پیاده سازی مثال بالا فقط کافی است متدی به شکل camel case در مدل تعریف کرده و همچنین کلاس use Illuminate\Database\Eloquent\Casts\Attribute; را use کنیم سپس متد را به شکل زیر پیاده سازی میکنیمprotected function firstName(): Attribute
{
return Attribute::make(
get: fn ($value) =&gt; ucfirst($value),
);
}هم‌اکنون می‌توان بدون تغییر هیچ کدی، از این accessor استفاده کرد. فرض کنید کاربری با شناسه‌ی 3 و نام nimaداریم:$user = User::find(3);
echo $user-&gt;first_name; // Nima
توجه شود که نام متد به صورت خودکار از camel case به snake case تبدیل میشود برای تعریف Mutators فقط کافیست در متد بالا به جای get از set استفاده کنیمprotected function firstName(): Attribute
{
return Attribute::make(
get: fn ($value) =&gt; ucfirst($value),
set: fn ($value) =&gt; strtolower($value),
);
}Casts:همونطور که میدانید در دیتابیس نمیتوانیم یک ارایه یا ابجکت ذخیره کنیم بلکه باید ان را به Json تبدیل کنیم فرض کنید یک ارایه از عکس های گالری یک کاربر داریم و برای ذخیره سازی باید هر بار ان را به Json تبدیل کنید و هر زمان که میخواهیم آن را دریافت کنیم باید آن را به یک ارایه تبدیل کنیم برای اینکه از این تبدیلات مککر خلاص شویم casts در لاراول به کمک ما امده است نگران نباشد برای استفاده از cast ها لازم نیست که یک متد جدید بسازید فقط کافیست یک پراپرتی را به شکل زیر در مدل خود تعریف کنیدclass User extends Model
{
    protected $casts = [
         &#039;images&#039; =&gt; &#039;array&#039;,
        &#039;is_premium&#039; =&gt; &#039;boolean&#039;,
        &#039;userObject&#039; =&gt; &#039;object&#039;;
        &#039;birthday&#039; =&gt; &#039;datetime&#039;
    ];
}این تبدیلات به صورت خود کار رفت و برگشتی انجام میشود.منبع : https://laravel.com/docs/9.x/eloquent-mutators#defining-an-accessorنویسنده : حسین غلامیان</description>
                <category>حسین غلامیان</category>
                <author>حسین غلامیان</author>
                <pubDate>Sat, 21 May 2022 18:03:35 +0430</pubDate>
            </item>
                    <item>
                <title>اسکوپ (scope) ها در لاراول</title>
                <link>https://virgool.io/@hosseingholamian/%D8%A7%D8%B3%DA%A9%D9%88%D9%BE-scope-%D9%87%D8%A7-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-i3xcyofrpsyh</link>
                <description>اسکوپ ها در لاراولفرض کنید میخواهید یک محدودیت را روی همه ی کوئری های یک مدل اجرا کنید مثلا یک مدل دارید که  فقط روی پست های قدیمی مثلا برای سال 2000 به قبل کار میکند برای اینکار از اسکوپ ها در لاراول استفاده میکنیم اسکوپ نوع اول اسکوپ های گلوبال می باشند که عملکرد softDeletes در لاراول نیز از همین اسکوپ های گلوبال بهره میگیرد در واقع softDelete روی همه ی کوئری های ما اجرا میشود و فقط ردیف هایی از دیتا بیس را بر میگرداند که ستون deleted_at آن null باشد.برای تعریف یک scope global جدید باید پوشه Scopes را در پوشه App بسازید  سپس در این پوشه یک کلاس به اسم ClassNameScope بسازید دقت کنیم که کامه scope باید در اخر اسم کلاس باشد این کلاس از اینترفیس Illuminate\Database\Eloquent\Scope  را implements می کند    &lt;?php
namespace App\Scopes;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class AncientScope implements Scope
{
public function apply(Builder $builder, Model $model)
{
$builder-&gt;where(&#039;created_at&#039;, &#039;&lt;&#039;, now()-&gt;subYears(2000));
}
}حالا برای apply کردن گلوبال اسکوپ به مدل فقط کافیست در مدل مورد نظر متد booted را باز نویسی کنیم&lt;?php
namespace App\Models;
use App\Scopes\AncientScope;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected static function booted()
{
static::addGlobalScope(new AncientScope);
}
}
اگر میخواستید کوئری ای بزنید که این محدودیت روی ان اعمال نشود فقط کافیست از متد زیر استفاده کنیدUser::withoutGlobalScope(AncientScope::class)-&gt;get();
Local scopeلوکال اسکوپ ها به شما این امکان را میدهد که برای کوئری هایی که به طور معمول استفاده میکنید یک key انتخاب کنید و هر وقت که از ان key استفاده کنید ان کوئری برای شما اجرا می شود برای مثالnamespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function scopeOfType($query, $type)
{
return $query-&gt;where(&#039;type&#039;, $type);
}
}
حالا در مدل User هرجا بخواهیم میتوانیم مانند زیر از این اسکوپ ها استفاده کنیم$users = User::ofType(&#039;admin&#039;)-&gt;get();
منبع:https://laravel.com/docs/9.x/eloquent#global-scopes نویسنده : حسین غلامیان</description>
                <category>حسین غلامیان</category>
                <author>حسین غلامیان</author>
                <pubDate>Sat, 21 May 2022 17:40:18 +0430</pubDate>
            </item>
                    <item>
                <title>تعیین دسترسی در لاراول Authorization</title>
                <link>https://virgool.io/@hosseingholamian/%D8%AA%D8%B9%DB%8C%DB%8C%D9%86-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-authorization-uajzsuqu0shq</link>
                <description>در ابتدا باید با مفهوم تعیین دسترسی اشنا شویم تعیین دسترسی یا Authorization با Athentication  تفاوت دارد Athentication بررسی میکند که آیا کاربر لاگین کرده است یا نه در واقع احراز هویت برای عملیات لاگین به کار میرود اما Authorization یا تعیین دسترسی بررسی میکند این کاربری که لاگین کرده اجازه چه عملیات هایی را دارد یا ندارد برای مثال هر کاربر میتواند فقط پستی را که خودش نوشته ویرایش کند درواقع نمی تواند پست دیگران را ویرایش کند به این عمل تعیین دسترسی میگویند برای پیاده سازی این کار در لاراول میتوانیم از دو روش مبنای closure یا class استفاده کنیم که در ابتدا روش اول را بررسی میکنیم برای این کار وارد پوشه ی App/providers/AuthServiceProvider شده و در متد boot دستور زیر را مینویسیمpublic function boot()
{
$this-&gt;registerPolicies();
Gate::define(&#039;update-post&#039;, function (User $user, Post $post) {
return $user-&gt;id === $post-&gt;user_id;
});
}همونطور که میبینید برای انجام این کار از فساد Gate استفاده شده و برای تعیین یک دسترسی متد define را صدا میزنیم که ارگومان اول یک نام برای دسترسی ای که میخواهیم ایجاد کنیم هست و ارگومان دوم یک closure میباشد . در همه ی تعیین دسترسی ها باید ابجکتی از مدل user به closure پاس داده شود و ما در این جا ارگومان دوم را نیز که ابجکتی از مدل post میباشد که به صورت type hint نوشته شده است را پاس داده ایم و در ادامه بررسی کرده ایم که ایا پست را همین کاربر نوشته است یا نهحال برای استفاده از این Gate باید وارد کنترلر مورد نظر شویم که در این مثالی که میخواهیم به کاربر اجازه ویرایش پست هایی را بدهیم که فقط خودش نوشته است بدیم ، وارد کنترلر PostController شده و متد update را به صورت زیر تکمیل میکنیم public function update(Request $request, Post $post)
{
if (! Gate::allows(&#039;update-post&#039;, $post)) {
abort(403);
}
// Update the post...
}همونطور که میبینید از متد allows برای مجوز دادن  به کاربر استفاده کرده ایم   که اگر کاربر اجازه ورود نداشت ارور 403 میدهد در غیر این صورت میتواند پست را ویرایش کند یا اینکه میتوانیم کار های بالا را در یک خط به صورت زیر خلاصه کنیم :Gate::authorize(&#039;update-post&#039;, $post);در روش دوم ابتدا باید یک کلاس Policy بسازیم توجه کنید که نام دهی این کلاس باید به صورت زیر باشدClassNamePolicyبرای ساخت این کلاس دستور زیر را در ترمینال اجرا میکنیمphp artisan make:policy PostPolicy
این کلاس در پوشه ی App\Policies ساخته میشود وارد کلاس شده و آن را به صورت زیر تکمیل میکنیم class PostPolicy
{
    use HandlesAuthorization;

    public function update(User $user, Post $post)
    {
        return $user-&gt;id === $post-&gt;user_id;
    }
}حال برای استفاده از این policy وارد کنترل مورد نظر شده و متد update را به صورت زیر تکمیل میکنیمclass PostController extends Controller
{
    public function update(Request $request, Post $post)
    {
        $this-&gt;authorize(&#039;update&#039;, $post);
        // Update the post...
    }
}نویسنده حسین غلامیان</description>
                <category>حسین غلامیان</category>
                <author>حسین غلامیان</author>
                <pubDate>Fri, 20 May 2022 14:11:51 +0430</pubDate>
            </item>
                    <item>
                <title>seeder در لاراول چیست</title>
                <link>https://virgool.io/@hosseingholamian/%D8%B1%D9%88%D8%A7%D8%A8%D8%B7-%D9%BE%D9%84%DB%8C-%D9%85%D9%88%D8%B1%D9%81%DB%8C%DA%A9-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-c34lygwkfit6</link>
                <description>فرض کنید به تازگی یک سایت خبری ساخته اید در صفحه اول سایت میخواهید 10 پست برتر را نشان دهید اما دیتابیس شما خالی است در لاراول seeders وظیفه این را دارد که دیتا بیس شما را با اطلاعات غیر واقعی پر کند برای استفاده از این ویژگی لاراول ابتدا باید یک seeder بسازید برای این کار در ترمینال دستور زیر را وارد  کنید php artisan make:seeder PostSeeder نام دهی seeder ها باید سه صورت منفرد باشد.بعد از اجرای دستور فوق به پوشه ی database/seeders بروید وارد فایلی که ساخته اید بشوید کلاس PostSeeder دارای یک متد به اسم run میباشد وقتی این کلاس به کمک artisan فراخئانی شود متد run اجرا میشود حال برای اینکه در دیتا بیس 10 رکورد ذخیره کنیم فقط کافی است در متد run کدی مانند زیر بنویسیم:&lt;?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;\
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class PostSeeder extends Seeder
{
public function run()
{
for ($i=1; $i &lt;11 ; $i++) {
DB::table(&#039;posts&#039;)-&gt;insert([
&#039;id&#039; =&gt; $i ,
&#039;title&#039; =&gt; &#039;Post &#039;. $i,
]);
}
}
}
حال برای اجرای seeder ها باید وارد فایل DatabaseSeeders  در پوشه ی database/seeders بشویم و seeder هایی را که ساخته ایم call کنیم &lt;?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{

public function run()
{
$this-&gt;call([
PostSeeder::class,
]);
}
}
سپس برای اینکه seeder هایی که کال کردیم اجرا شوند فقط کافیست دستور زیر را در ترمینال وارد کنیمphp artisan db:seedیا اینکه میتوانیم بدون کال کردن seeder ها در کلاس DatabaseSeeders ان ها را مستقیم اجرا کنیم برای این کار از دستور زیر استفاده میکنیمphp artisan db:seed --class=PostSeederنویسنده : حسین غلامیان</description>
                <category>حسین غلامیان</category>
                <author>حسین غلامیان</author>
                <pubDate>Fri, 20 May 2022 11:00:32 +0430</pubDate>
            </item>
                    <item>
                <title>نصب و فارسی سازی پکیج sluggable در لاراول</title>
                <link>https://virgool.io/@hosseingholamian/%D9%86%D8%B5%D8%A8-%D9%88-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%BE%DA%A9%DB%8C%D8%AC-sluggable-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-ujkrzdzt1alp</link>
                <description>گام یک : نصب پکیج با استفاده از دستور زیر در ترمینالcomposer require cviebrock/eloquent-sluggableگام 2 : دستور زیر را در ترمینال وارد کنید :php artisan vendor:publish --provider=&quot;Cviebrock\EloquentSluggable\ServiceProvider&quot;گام 3 : وارد پوشه config/sluggable.php شوید و مقدار  method =&gt; null را با زیر جایگزین کنید&#039;method&#039; =&gt; function($string, $separator = &#039;-&#039;) {
$_transliteration = array(
&#039;/ä|æ|ǽ/&#039; =&gt; &#039;ae&#039;,
&#039;/ö|œ/&#039; =&gt; &#039;oe&#039;,
&#039;/ü/&#039; =&gt; &#039;ue&#039;,
&#039;/Ä/&#039; =&gt; &#039;Ae&#039;,
&#039;/Ü/&#039; =&gt; &#039;Ue&#039;,
&#039;/Ö/&#039; =&gt; &#039;Oe&#039;,
&#039;/À|Á|Â|Ã|Å|Ǻ|Ā|Ă|Ą|Ǎ/&#039; =&gt; &#039;A&#039;,
&#039;/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª/&#039; =&gt; &#039;a&#039;,
&#039;/Ç|Ć|Ĉ|Ċ|Č/&#039; =&gt; &#039;C&#039;,
&#039;/ç|ć|ĉ|ċ|č/&#039; =&gt; &#039;c&#039;,
&#039;/Ð|Ď|Đ/&#039; =&gt; &#039;D&#039;,
&#039;/ð|ď|đ/&#039; =&gt; &#039;d&#039;,
&#039;/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě/&#039; =&gt; &#039;E&#039;,
&#039;/è|é|ê|ë|ē|ĕ|ė|ę|ě/&#039; =&gt; &#039;e&#039;,
&#039;/Ĝ|Ğ|Ġ|Ģ/&#039; =&gt; &#039;G&#039;,
&#039;/ĝ|ğ|ġ|ģ/&#039; =&gt; &#039;g&#039;,
&#039;/Ĥ|Ħ/&#039; =&gt; &#039;H&#039;,
&#039;/ĥ|ħ/&#039; =&gt; &#039;h&#039;,
&#039;/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ/&#039; =&gt; &#039;I&#039;,
&#039;/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı/&#039; =&gt; &#039;i&#039;,
&#039;/Ĵ/&#039; =&gt; &#039;J&#039;,
&#039;/ĵ/&#039; =&gt; &#039;j&#039;,
&#039;/Ķ/&#039; =&gt; &#039;K&#039;,
&#039;/ķ/&#039; =&gt; &#039;k&#039;,
&#039;/Ĺ|Ļ|Ľ|Ŀ|Ł/&#039; =&gt; &#039;L&#039;,
&#039;/ĺ|ļ|ľ|ŀ|ł/&#039; =&gt; &#039;l&#039;,
&#039;/Ñ|Ń|Ņ|Ň/&#039; =&gt; &#039;N&#039;,
&#039;/ñ|ń|ņ|ň|ŉ/&#039; =&gt; &#039;n&#039;,
&#039;/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ/&#039; =&gt; &#039;O&#039;,
&#039;/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º/&#039; =&gt; &#039;o&#039;,
&#039;/Ŕ|Ŗ|Ř/&#039; =&gt; &#039;R&#039;,
&#039;/ŕ|ŗ|ř/&#039; =&gt; &#039;r&#039;,
&#039;/Ś|Ŝ|Ş|Ș|Š/&#039; =&gt; &#039;S&#039;,
&#039;/ś|ŝ|ş|ș|š|ſ/&#039; =&gt; &#039;s&#039;,
&#039;/Ţ|Ț|Ť|Ŧ/&#039; =&gt; &#039;T&#039;,
&#039;/ţ|ț|ť|ŧ/&#039; =&gt; &#039;t&#039;,
&#039;/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ/&#039; =&gt; &#039;U&#039;,
&#039;/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ/&#039; =&gt; &#039;u&#039;,
&#039;/Ý|Ÿ|Ŷ/&#039; =&gt; &#039;Y&#039;,
&#039;/ý|ÿ|ŷ/&#039; =&gt; &#039;y&#039;,
&#039;/Ŵ/&#039; =&gt; &#039;W&#039;,
&#039;/ŵ/&#039; =&gt; &#039;w&#039;,
&#039;/Ź|Ż|Ž/&#039; =&gt; &#039;Z&#039;,
&#039;/ź|ż|ž/&#039; =&gt; &#039;z&#039;,
&#039;/Æ|Ǽ/&#039; =&gt; &#039;AE&#039;,
&#039;/ß/&#039; =&gt; &#039;ss&#039;,
&#039;/Ĳ/&#039; =&gt; &#039;IJ&#039;,
&#039;/ĳ/&#039; =&gt; &#039;ij&#039;,
&#039;/Œ/&#039; =&gt; &#039;OE&#039;,
&#039;/ƒ/&#039; =&gt; &#039;f&#039;
);
$quotedReplacement = preg_quote($separator, &#039;/&#039;);
$merge = array(
&#039;/[^\s\p{Zs}\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]/mu&#039; =&gt; &#039; &#039;,
&#039;/[\s\p{Zs}]+/mu&#039; =&gt; $separator,
sprintf(&#039;/^[%s]+|[%s]+$/&#039;, $quotedReplacement, $quotedReplacement) =&gt; &#039;&#039;,
);
$map = $_transliteration + $merge;
unset($_transliteration);
return preg_replace(array_keys($map), array_values($map), $string);},گام 4: اضافه کردن متد زیر در مدل های مورد نظر  که میخواهید از اسلاگ استفاده کنیدتوجه کنید که باید use trait sluggable را انجام دهید    use Cviebrock\EloquentSluggable\Sluggable;

class Post extends Model
{
    use HasFactory , SoftDeletes, Sluggable ;
    protected $fillable = [  &#039; slug &#039; , &#039; title &#039;, &#039; description &#039;  ];
    public function sluggable(): array
    {
        return [
            &#039;slug&#039; =&gt; [
                &#039;source&#039; =&gt; &#039;title&#039;
            ]
        ];
    }
}مقدار source برابر است با مقداری که اسلاگ بر اساس ان ساخته  می شود که باید همان نام فیلد مورد نظر در دیتا بیس باشدنویسنده : حسین غلامیان</description>
                <category>حسین غلامیان</category>
                <author>حسین غلامیان</author>
                <pubDate>Thu, 19 May 2022 18:34:11 +0430</pubDate>
            </item>
                    <item>
                <title>اگر جای دیگران بودیم آیا ادم بهتری می شدیم؟</title>
                <link>https://virgool.io/@hosseingholamian/%D8%A7%DA%AF%D8%B1-%D8%AC%D8%A7%DB%8C-%D8%AF%DB%8C%DA%AF%D8%B1%D8%A7%D9%86-%D8%A8%D9%88%D8%AF%DB%8C%D9%85-%D8%A2%DB%8C%D8%A7-%D8%A7%D8%AF%D9%85-%D8%A8%D9%87%D8%AA%D8%B1%DB%8C-%D9%85%DB%8C-%D8%B4%D8%AF%DB%8C%D9%85-uhmioejgzpqo</link>
                <description>این سوالی است که هر روز از خودمان باید بپرسیم که اگر جای دیگری بودیم ادم بهتری میشدیم ؟ قبل از اینکه کسی را سرزنش کنیم ، مسخره کنیم  و در کل قبل از اینکه کسی را قضاوت کنیم .یک فرد بیسواد را در نظر بگیریم اکثر مردم بدون توجه به اینکه او در چه شرایط اقتصادی ، خانوادگی ، و عاطفی ای رشد کرده و وارد جامعه شده و بدون دانستن اینکه جامعه چه اسیب هایی به این فرد زده او را سرزنش میکنند و میگویند اگر تلاش میکردی میتوانستی! همه ی تقصیر ها را گردن او می اندازند ، خودشان را مثال می زنند که من با تلاشی که کردم به  موفقیت رسیدم اگر تو میخواستی میتوانستی!اینکه میگویند همه ی کمبود هایت تقصیر خودت است ، درست نیست . او چه تقصیری دارد که در یک خانواده ضعیف به دنیا امده ؟ تقصیر او چیست که پدرش را در کودکی از دست داده ؟ تقصیر او چیست که در کشوری به دنیا امده که اگر بخواهد پراید بخرد باید 50 سال کار کند و اگر بخواهد خونه بخرد باید 1000 سال کار کند ؟ تقصیر او چیست که فرزند طلاق بوده؟ یتیم بوده؟ در روستا به دنیا امده؟ در روستایشان مدرسه وجود نداشته اگر هم بوده معلمی وجود نداشته؟ در شهر و روستایشان کار نبوده ؟ کنار خانه اشان پر از معتاد بوده؟ تقصیر او چیست که در کودکی به او تجاوز شده؟اگر ما هم این شرایط را داشتیم باز هم زندگیمان این میشد ؟ تحصیل کرده بودیم ؟ می توانستیم کنکور قبول شویم؟ اگر عدالت وجود داشت و شرایطمان یکسان بود شاید او دکتر و مهندس میشد و ما میشدیم آن شخصی که هرروز در جامعه سرزنش میشود .بیایید فراتر برویم این سوال میتواند خیلی ترسناک تر از این ها بشود یک قاتل سریالی را در نظر بگیرید این قاتل که از همان نوزادی قاتل نبوده بلکه شرایط زندگی و فرایندی که تا بالغ شدن طی کرده او را تبدیل به قاتل سریالی کرده . برای مثال در یک خانواده فقیر به دنیا امده . پدرش هر روز مست میکرده و مادرش را کتک میزده . پدرش در کودکیش چندین بار به او تجاوز کرده . در مدرسه به او زور گویی میشده و کتک میخورده . در نوجوانی ترک تحصیل کرده . چند سال بعد به دلیل کتک های پدرش ، مادرش فوت کرده و پدرش به اعدام محکوم شده. هیچ دوستی نداشته و ندارد .خب حالا شرایط بالا را در نظر بگیریم اگر ما به جای او بودیم چقدر احتمال داشت که ما هم یک قاتل سریالی شویم؟نمیگویم که خود فرد هیچ کوتاهی ای در زندگیش نداشته اما ایا ما کوتاهی نداریم ؟ چه تضمینی وجود دارد که اگر ما جای او بودیم بهتر از او میشدیم ؟ ایا ما توانایی مقابله با این شرایط را داشتیم ؟ انقدر راحت یکدیگر را قضاوت نکنیم.حسین غلامیان</description>
                <category>حسین غلامیان</category>
                <author>حسین غلامیان</author>
                <pubDate>Wed, 11 May 2022 20:20:36 +0430</pubDate>
            </item>
                    <item>
                <title>Entity Attribute Value model (EAV)  چیست؟</title>
                <link>https://virgool.io/@hosseingholamian/entity-attribute-value-model-eav-%DA%86%DB%8C%D8%B3%D8%AA-tygyfucf9mt5</link>
                <description>فرض کنید شما یک فروشگاه اینترنتی دارید در این فروشگاه هر محصول شما ویژگی های منحصر به فردی دارد برای مثال محصول موبایل ویژگی های مقدار رم، مقدار حافظه ،رنگ ،مدل  ،سال تولید ، مدل پردازنده و ... را دارا میباشد از طرفی محصول لباس شما دارای ویژگی های سایز ، رنگ ، برند و ... دارد در واقع هر محصول شما ویژگی های منحصر به فرد خودش را دارد .در این صورت دیتابیس این فروشگاه را چطور طراحی میکنید؟ یعنی میخواهید برای هر محصول یک جدول جداگانه تشکیل دهید و ستون های جدول ویژگی هایش باشد ؟اگر فروشگاه شما یک محصول منحصر به فرد داشته باشد مثلا اگر شما در فروشگاهتان فقط کتاب میفروشید شاید این یک راهکار باشد اما اگر شما هزاران محصول مختلف داشته باشید چه؟ هزار تا جدول در دیتا بیس تشکیل میدهید ؟ اگر در اینده بخواهید یک محصول به شرکتتان اضافه کنید چه؟ در این صورت چکار میکنید؟مدل EAV این مشکل را برای ما حل میکند این مدل مخفف entity attribute values است کلمه ی اول به معنای موجودی کلمه دوم به معنای ویژگی های موجودی و کلمه ی سوم مقدار این ویژگی ها است .به طور خلاصه این مدل به صورت عکس زیر تعریف میشود.همونطور که در تصویر بالا می بینید سه جدول entity , attribute, value کار هزاران جدول را برای ما میکند .در مثال فروشگاهی ما هر entity یا موجودیت ما یک محصول است برای مثال موبایل ، لپ تاب ، لباس ، پنکه ، لیوان و ...در جدول دوم attribute یا ویژگی ها تمام ویژگی ها نوشته شده است برای مثال رنگ ، مقدار رم، مقدار حافظه ، و ...و در جدول سوم value یا مقدار ویژگی ها که  با استفاده از رابطه ی one to many  به ویژگی مورد نظر و همچنین به موجودیت یا محصول مورد نظر وصل شده است  . به این صورت است که هر value فقط متعلق به یک attribute و به یک entity می باشد اما یک موجودیت میتواند چند ویژگی و مقدار داشته باشد همچنین یک ویژگی میتواند چندین مقدار و موجودیت داشته باشد.از موارد استفاده ی این مدل میتوان به موارد  فرم ساز ها و پیج ساز ها و  بخش های مختلف فروشگاه ها  اشاره کرد.نویسنده : حسین غلامیان</description>
                <category>حسین غلامیان</category>
                <author>حسین غلامیان</author>
                <pubDate>Wed, 11 May 2022 16:41:42 +0430</pubDate>
            </item>
            </channel>
</rss>