Заведите отношения с красноречивым - PullRequest
0 голосов
/ 20 июня 2020

Я использую laravel 6.16.0, и у меня есть две миграции:

person

  Schema::create('persons', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('full_name')->nullable($value = true);
            $table->date('date_of_birth')->nullable($value = true);
            $table->string('phone')->nullable($value = true);
            $table->string('office')->nullable($value = true);
            $table->timestamps();
  });

senator_attributes

        Schema::create('senator_attributes', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->integer('persons_id')->default('999999')->nullable($value = true);
            $table->string('party')->nullable($value = true);
            // ...
            $table->timestamps();
        });

Мои модели выглядят следующим образом:

class Person extends Model
{
    protected $table = 'persons';

    protected $guarded = ['id'];

}
class SenatorAttributes extends Model
{
    protected $table = 'senator_attributes';

    protected $guarded = ['id'];

    public function person()
    {
        return $this->belongsTo(Person::class, 'persons_id');
    }
}

Мне было интересно, как я могу запросить всех людей и получить для каждого человека их атрибуты?

Я ценю ваши ответы !

1 Ответ

2 голосов
/ 20 июня 2020

Для довольно простых решений вы можете напрямую:

Во-первых, вам нужно добавить модель SenatorAttributes внутри модели Person. Это можно сделать следующим образом:

class Person extends Model
{
    protected $table = 'persons';

    protected $guarded = ['id'];

    public function senator_attributes()
    {
        return $this->hasMany(SenatorAttributes::class, 'persons_id'); // or you can use hasOne if person model is supposed to only have one single senator attribute.
    }
}

Теперь загружаем атрибуты сенатора для каждого человека.

Solution 1, с нетерпеливой (ранней / отчаянной) Загрузка:

$persons = Person::with('senator_attributes')->get();

Solution 2, загрузка по требованию:

$persons = Person::all();
foreach($persons as $person) {
    $senator_attribures = $person->senator_attributes;
    // write your logic here...
}

Решение 1 подойдет пока вы не загружаете все строки во время выполнения. Если вы планируете загружать сотни / тысячи моделей, рассмотрите фрагменты как решение и используйте с ним активную загрузку.

Узнайте больше о Laravel Eloquent Relationships здесь .

Теперь прочтите следующее, если вас интересуют лучшие практики.

Я не хочу показаться любопытным, но лично я следую следующим основным правилам при работе над любым проектом.

  • Имя таблицы всегда должно быть во множественном числе и модель имя должно быть в единственном числе. Например, таблица persons будет иметь модель Person.

  • Внешние ключи всегда должны быть в singular form of referenced table + referenced column of the referenced table. Например, если вы wi sh добавляете ссылку person в таблицу senator_attributes, вы должны добавить столбец person_id в senator_attributes таблицу.

Факт, Laravel поддерживает это соглашение об именах, прежде всего, вы экономите свое время и поддерживаете единообразие и практику в командах и проектах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...