Eloquent ORM: Vytvoření záznamu souvisejícího modelu – metody save() a create()

Příklad: Přidání komentáře (comment) ke článku (post)

Rozdíl mezi metodami save() a create()

Metoda save() očekává jako vstupní parametr objekt modelu Eloquentu.
Metoda create() očekává jako vstupní parametr pole. Metoda sama vytvoří z dat v poli objekt modelu Eloquentu a poté jej uloží.

Pokračování textu Eloquent ORM: Vytvoření záznamu souvisejícího modelu – metody save() a create()

Eloquent ORM: Vytváříme třídy modelu

Model v tomto případě představuje vrstvu aplikace která komunikuje s databází za účelem získávání a ukládání data.

Knihovna Eloquent ORM je k dispozici jako součást velmi oblíbeného PHP frameworku Laravel. Lze ji také použít i samostatně, případně v rámci frameworku vlastního.

Eloquent ORM používá implementaci Active Record. Jedná se o způsob přístupu k datům v databázi způsobem, kdy každá třída modelu představuje jednu tabulku v databázi a každá instance této třídy představuje jeden záznam (řádek) z tabulky v databázi.

Pokračování textu Eloquent ORM: Vytváříme třídy modelu

Eloquent ORM: Relace: Has Many Through

Has Many Through

Poskytuje pohodlnou zkratku pro přístup ke vzdáleným relacím pomocí prostřední vazby.

Příklad

Model Country může mít mnoho modelů Post prostřednictvím modelu User:

Pomocí relace hasManyThrough lze jednoduše získat všechny příspěvky (tabulka posts) pro danou zemi (tabulka countries), přestože tabulka posts neobsahuje přímou vazbu na tabulku countries.

$country->posts

Struktura modelu

namespace App;

use Illuminate\Database\Eloquent\Model;

class Country extends Model
{

  /**
   * Get all of the posts for the country.
   */
  public function posts()
  {
    return $this->hasManyThrough('App\Post', 'App\User');
  }

}

Jako první parametr metody hasManyThrough uvádíme model ke kterému chceme získat přístup, jako druhý parametr uvádíme model prostředníka.

Zdroje

Eloquent ORM: Relace 1:1 (one-to-one)

Základní vztah kdy jeden prvek z první skupiny je spojen s jedním jediným prvkem z druhé skupiny.

Např. jeden člověk má (has one) jedno rodné číslo. A jedno rodné číslo patří (belongs to) jednomu člověku.

Vztahy typu 1:1 obecně nemusíme, ale podle potřeby můžeme rozdělovat do více tabulek (entit).

Pokračování textu Eloquent ORM: Relace 1:1 (one-to-one)

Eloquent ORM: Relace: Polymorfní relace

Umožňují jednomu modelu patřit více než jednomu jinému modelu v rámci jedné asociace.

Příklad

Např. pokud uživatelé mohou psát komentáře jak ke článkům tak k videím.

Užitím polymorfních relací stačí jedna tabulka ve které uložíme všechny komentáře.

  • sloupec commentable_id obsahuje id článku nebo videa
  • sloupec commentable_type obsahuje název třídy daného modelu

Struktura modelu

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
  
  /**
   * Get all of the owning commentable models.
   */
  public function commentable()
  {
    return $this->morphTo();
  }

}
namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{

  /**
  * Get all of the post's comments.
  */
  public function comments()
  {
    return $this->morphMany('App\Comment', 'commentable');
  }

}
namespace App;

use Illuminate\Database\Eloquent\Model;

class Video extends Model
{

  /**
  * Get all of the video's comments.
  */
  public function comments()
  {
    return $this->morphMany('App\Comment', 'commentable');
  }

}

 

Polymorfní relace Many To Many

Modely Post a Video mohou sdílet polymorfní relaci k modelu Tag.

Umožňuje mít jeden seznam tagů, který používají články (posts) i videa (videos).

 

Zdroje

Laravel: Databáze

Illuminate Database

https://github.com/illuminate/database

Komponenta Illuminate Database je plnohodnotná sada nástrojů pro práci s daty v databázi. Obsahuje

  • ORM typu ActiveRecord nazvaný Eloquent ORM
  • funkce pro generování dotazů (expressive query builder)
  • schema builder

Capsule

$results = Capsule::select('select * from users where id = ?', array(1));

Query Builder

$users = Capsule::table('users')->where('votes', '>', 100)->get();

Schema Builder

Capsule::schema()->create('users', function ($table) {
  $table->increments('id');
  $table->string('email')->unique();
  $table->timestamps();
});

Eloquent ORM

class User extends Illuminate\Database\Eloquent\Model {}

$users = User::where('votes', '>', 1)->get();