Как лучше всего создать массив объектов внутри класса как атрибут в PHP? - PullRequest
0 голосов
/ 06 августа 2020

Мне трудно найти лучший и правильный способ сделать это, поэтому я отправляю этот вопрос, если кто-то может мне здесь помочь, поскольку я делаю проект Laravel в PHP.

Итак, давайте представим, что мы создаем приложение для книг, каждая книга состоит из нескольких страниц, у некоторых их 20, а у некоторых может быть 700, если бы мы правильно создали класс или классы для этих книг, как мы сделать это?

Ниже у меня есть несколько способов go об этом, но я не знаю, что сработает и / или какой лучший.

Вариант 1:

<?php
namespace Translation/Logic;

public class Book {
  // atributes
  public $title;
  public $year;
  public $author;
  public $description;
  public $date;
  public $language = "English";

  // as an atribute maybe we need to have an array of pages here? like
  // public $pages = Pages[]??
}

public class Pages {
   public number;
   public orientation;
   public direction;
   public page;
   public chapter;
   public content;

}

Вариант 2:

<?php
namespace Translation/Logic;

abstract class Book {
  // atributes
  public $title;
  public $year;
  public $author;
  public $description;
  public $date;
  public $language = "English";

  // as an attributes maybe we need to have an array of pages here? 
}

public class Pages extends Book {
   public number;
   public orientation;
   public direction;
   public page;
   public chapter;
   public content;

}
// Then create an array of Pages here, but then we have all the attributes of the books in every page, which don't really make sense?

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

Если это одно из моих решений, то какой код должен завершать мой код, а также есть ли какие-либо альтернативные способы, кроме моего, и каковы будут плюсы и минусы каждого из них.

Если нет, и я ошибаюсь, то как правильно определять эти классы и почему?

Спасибо, что нашли время ответить мне :)

1 Ответ

4 голосов
/ 06 августа 2020

Как говорит Тим ​​Льюис в комментариях к своему вопросу, лучший способ сделать это - использовать модели Eloquent.

Позвольте мне дать вам быстрый пример того, как лучше всего это сделать.

Это будет его Класс книги .

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['title', 'year', 'author', 'description', 'date', 'language'];

    /**
    * Get the pages of this book.
    *
    * @return \Illuminate\Database\Eloquent\Relations\HasMany
    */
    public function pages()
    {
        return $this->hasMany('App\Page');
    }

}

Это будет его Класс страницы .

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Page extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['number', 'orientation', 'direction', 'page', 'date', 'chapter', 'content'];

    /**
    * Get the book of this page.
    *
    * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
    */
    public function book()
    {
        return $this->belongsTo('App\Book');
    }

}

Итак, если вы хотите получить все книги со всеми вашими страницами вам придется сделать это в таком контроллере.

$books = Book::with('pages')->get();

Если вы просто хотите получить книгу со своими страницами .

$book = Book::with('pages')->first();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...