Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?

Laravel tinker'da olusturdugum bir modeli terminalde var_dump ile vurdugumda assagiki attigim sekilde cikti aliyorum.Simdi mesela ben $idea->title dersem 'Cumque Eius Consectetur Cum' olarak cikti veriyor fakat $idea->connection dedigimde 'mysql' ciktisi alamiyorum ve objede $idea->title dedigimde neden direkt ["attributes":protected] icine giriyor ?

Benim Fruit adında bir classim olsa ve o classim var name ve color diye 2 class properties var diyelim ben olusturdum objeyi ve bastigimda

object(Fruit)#3605 (2) {
  ["name"]=>
  string(5) "Apple"
  ["color"]=>
  string(3) "Red"
}

Olur ve $fruit->name ile 'Apple' a ulasirim burada $idea daha farkli mesela neden ["attributes":protected] icerisinde benim fieldlarim ve ona nasil ulasiyorum direkt $idea->title diyerek sonucta $fruit->color gibi degil bir array icerisinde ? Sacmaladiysam mazur gorun tam anlamadım yani.

$idea->connection gibi bir seye ihtiyacim yok sadece merak ettim ve sanirim Object'i tam anlamamisim dedim bu sekil ikilemde kalinca ondan soruyorum yanitlar icin simdiden tesekkurler..

$idea = Idea::first();
var_dump($idea);
object(App\Models\Idea)#4332 (28) {
  ["guarded":protected]=>
  array(0) {
  }
  ["connection":protected]=>
  string(5) "mysql"
  ["table":protected]=>
  string(5) "ideas"
  ["primaryKey":protected]=>
  string(2) "id"
  ["keyType":protected]=>
  string(3) "int"
  ["incrementing"]=>
  bool(true)
  ["with":protected]=>
  array(0) {
  }
  ["withCount":protected]=>
  array(0) {
  }
  ["preventsLazyLoading"]=>
  bool(false)
  ["perPage":protected]=>
  int(15)
  ["exists"]=>
  bool(true)
  ["wasRecentlyCreated"]=>
  bool(false)
  ["attributes":protected]=>
  array(7) {
    ["id"]=>
    int(3)
    ["user_id"]=>
    int(1)
    ["title"]=>
    string(27) "Cumque Eius Consectetur Cum"
    ["slug"]=>
    NULL
    ["description"]=>
    string(169) "Voluptatem ut mollitia nam aut fuga. Quibusdam necessitatibus illum optio et. Cum laborum eligendi magnam sint. Perferendis vel quaerat qui provident rerum dolore error."
    ["created_at"]=>
    string(19) "2021-09-07 12:23:43"
    ["updated_at"]=>
    string(19) "2021-09-07 12:23:43"
  }
  ["original":protected]=>
  array(7) {
    ["id"]=>
    int(1)
    ["user_id"]=>
    int(1)
    ["title"]=>
    string(27) "Cumque Eius Consectetur Cum"
    ["slug"]=>
    NULL
    ["description"]=>
    string(169) "Voluptatem ut mollitia nam aut fuga. Quibusdam necessitatibus illum optio et. Cum laborum eligendi magnam sint. Perferendis vel quaerat qui provident rerum dolore error."
    ["created_at"]=>
    string(19) "2021-09-07 12:23:43"
    ["updated_at"]=>
    string(19) "2021-09-07 12:23:43"
  }
  ["changes":protected]=>
  array(0) {
  }
  ["casts":protected]=>
  array(0) {
  }
  ["classCastCache":protected]=>
  array(0) {
  }
  ["dates":protected]=>
  array(0) {
  }
  ["dateFormat":protected]=>
  NULL
  ["appends":protected]=>
  array(0) {
  }
  ["dispatchesEvents":protected]=>
  array(0) {
  }
  ["observables":protected]=>
  array(0) {
  }
  ["relations":protected]=>
  array(0) {
  }
  ["touches":protected]=>
  array(0) {
  }
  ["timestamps"]=>
  bool(true)
  ["hidden":protected]=>
  array(0) {
  }
  ["visible":protected]=>
  array(0) {
  }
  ["fillable":protected]=>
  array(0) {
  }
}

    ilhan_ersoy Obje içindeki protected ve private değerlere dışarıdan ulaşamazsınız. Ulaşılabilecek olanlara izin verilmişse genellike bir getter tanımlanır. Örneğiniz için getter var mesela, $idea->getConnectionName(). Hepsine ulaşamamanızın sebebi yazılım mimarisi ile alakalı, bazısına ihtiyacınız yok bazısına özellikle ulaşılamaması gerekiyor vs...

      mgsmus Hocam evet classta tanımlanmış protected ve private değerlere dışardan ulaşılmıyor doğru.Yani bu :protected dedigi property'nin type'i okey anladım.Peki ben $idea->title dedigim zaman nasıl direkt

      ["original":protected]=>
        array(7) {
          ["id"]=>
          int(1)
          ["user_id"]=>
          int(1)
          ["title"]=>
          string(27) "Cumque Eius Consectetur Cum"
          ["slug"]=>
          NULL
          ["description"]=>
          string(169) "Voluptatem ut mollitia nam aut fuga. Quibusdam necessitatibus illum optio et. Cum laborum eligendi magnam sint. Perferendis vel quaerat qui provident rerum dolore error."
          ["created_at"]=>
          string(19) "2021-09-07 12:23:43"
          ["updated_at"]=>
          string(19) "2021-09-07 12:23:43"
        }

      içerisine giriyor ?

      object(App\Models\Idea)#4332(28) {
        ["id"]=>
          int(1)
          ["user_id"]=>
          int(1)
          ["title"]=>
          string(27) "Cumque Eius Consectetur Cum"
          ["slug"]=>
          NULL
          ["description"]=>
          string(169) "Voluptatem ut mollitia nam aut fuga. Quibusdam necessitatibus illum optio et. Cum laborum eligendi magnam sint. Perferendis vel quaerat qui provident rerum dolore error."
          ["created_at"]=>
          string(19) "2021-09-07 12:23:43"
          ["updated_at"]=>
          string(19) "2021-09-07 12:23:43"
      }

      Seklinde olsa ne sikinti olur ?

        ilhan_ersoy Model::__get() magic yöntemi ile Model::$attributes özelliğinden çekiyor. Aynısı olmasa da benzer örnek olarak:

        class Model 
        {
            protected array $attributes = [
                'id' => 1,
                'name' => 'İlhan',
            ];
        
            public function __get($key)
            {
                return $this->attributes[$key];
            }
        }
        $model = new Model();
        
        echo $model->name; // İlhan

        İkinci sorunun cevabı ise, öyle olabilmesi için alanların dinamik olarak objeye eklenmesi lazım, bu sefer objelerin değişimini tutamazsınız, aynı isimde özellikler ezilir ve/veya aynı isimde olup olamayacağını kontrol edemezsiniz. Mesela original dizisi kayıt güncellenirken orjinal alanları kullanıyor böylece $model->isDirty('name') gibi bu alan güncelleniyor mu güncellenmiyor mu şeklinde karşılaştırma işlemleri yapabiliyorsunuz.

        use App\Models\User;
        
        $user = User::create([
            'first_name' => 'Taylor',
            'last_name' => 'Otwell',
            'title' => 'Developer',
        ]);
        
        $user->title = 'Painter';
        
        $user->isDirty(); // true
        $user->isDirty('title'); // true
        $user->isDirty('first_name'); // false
        
        $user->isClean(); // false
        $user->isClean('title'); // false
        $user->isClean('first_name'); // true
        
        $user->save();
        
        $user->isDirty(); // false
        $user->isClean(); // true

        Bu işlemlerin hepsi üstteki mantık sayesinde yapılabiliyor.

          mgsmus Anladım tam olarak çok teşekkürler abi sağolasınn