среда, 12 июля 2017 г.

LARAVEL. ИСПОЛЬЗОВАНИЕ МОДЕЛЕЙ. ЧАСТЬ 2.

Добавление информации в БД методом create(). В файле \app\Http\Controllers\Admin\Core.php:

  public function getArticles() {    
        $articles = Article::create(
                                    [
                                    'name'=>'Hello world!',
                                    'text'=>'Text of the Hello world',
                                    'img'=>'hello.jpg',
                                    ]
                                    );
        $articles = Article::all();
        dump($articles);
    }
Если мы используем метод create(), то сначала фреймворку нужно указать список полей, в которые разрешается добавление информации. Иначе он будет выдавать ошибку MassAssignmentException.

Для этого в модели надо переопределить одно свойство $fillable. Идем в app/Article.php

class Article extends Model
{
 // protected $table = 'articles'; // указываем имя таблицы БД. Это необязательное свойство, если имя модели совпадает с именем таблицы.
 protected $primaryKey = 'id'; // По умолчанию это id. Если это не так, то нужно указать поле.
 public $incrementing = TRUE; // Автоинкремент.
 
 public $timestamps = TRUE; // Для автозаполнения полей даты создания и даты изменения.
 
 protected $fillable = ['name', 'text', 'img']; // массив, который содержит список полей, доступных для записи
 
}
Свойство $guarded содержит список полей недоступных для записи.
protected $guarded = ['*']; // все поля таблицы запрещены для записи

В нашем случае:
protected $fillable = ['name', 'text']; // массив, который содержит список полей, доступных для записи
protected $guarded = ['img']; // какое поле запрещено для записи

Добавление информации в БД методом firstOrCreate() - добавление уникальной информации по определенному полю.  
Этот метод сначала проверяет есть ли уже такая же запись. И запись была, то она не будет добавлена повторно.
В файле \app\Http\Controllers\Admin\Core.php:


public function getArticles() {    
        $articles = Article::firstOrCreate(
                                    [
                                    'name'=>'Hi!',
                                    'text'=>'Text of the Hi'                                    
                                    ]
                                    );
        $articles = Article::all();
        dump($articles);
    }


Добавление информации в БД методом firstOrNew() - помогает добавлять информацию в БД. После этого метода используется метод save().
Сначала он проверит есть ли в БД запись с такими данными. Если есть, то firstOrNew() возвращает объект модели.
Если такой записи нет, то firstOrNew() возвращает объект модели для данных параметров. Но вставки информации в БД не происходит! 
А после этого вызываем метод save().

 public function getArticles() { 
 $article = Article::firstOrNew(
 [
 'name'=>'Hi3!',
 'text'=>'Text of the Hi3' 
 ]
 );
 $article->save();
 
 $articles = Article::all();
 dump($articles);
 }

Удаление информации из БД методом delete(). Удаляется запись, которая соответствует данной модели.
 public function getArticles() { 
 $article = Article::find(19);
 $article->delete(); 
 
 $articles = Article::all();
 dump($articles);
 }

Можно не выбирать записи, а удалить их сразу методом destroy().
public function getArticles() { 
 Article::destroy(18); 
 
 $articles = Article::all();
 dump($articles);
 }

Можно удалить сразу несколько записей. Для этого нужно передать массив.
Article::destroy([16, 17]);  

Для удаления можно использовать конструкторы запросов:
Article::where('id', '>', '13')->delete();  

Мягкое удаление похожее на корзину операционной системы Windows.
Записи из БД физически не удаляются, но при этом в таблицу нужно добавить дополнительное поле.

Создадим миграцию в консоли: php artisan make:migration change_article_table_soft --table=articles

Идем в файл database\migrations\2017_07_12_170959_change_article_table_soft.php

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class ChangeArticleTableSoft extends Migration
{
 
 public function up()
 {
 Schema::table('articles', function (Blueprint $table) {
 $table->softDeletes();
 });
 }

 
 public function down()
 {
 Schema::table('articles', function (Blueprint $table) {
 $table->dropColumn('deleted_at');
 });
 }
}
Применим миграцию: php artisan migrate 

После этого в БД появляется колонка deleted_at.

Идем в модель app/Article.php и добавляем трейт.
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Article extends Model
{
    use SoftDeletes;
    
    // protected $table = 'articles'; // указываем имя таблицы БД. Это необязательное свойство, если имя модели совпадает с именем таблицы.
    protected $primaryKey = 'id'; // По умолчанию это id. Если это не так, то нужно указать поле.
    public $incrementing = TRUE; // Автоинкремент.
    
    public $timestamps = TRUE; // Для автозаполнения полей даты создания и даты изменения.
    
    protected $fillable = ['name', 'text']; // массив, который содержит список полей, доступных для записи
    
 protected $guarded = ['img']; // какое поле запрещено для записи

 protected $dates = ['deleted_at'];
    
}
Адрес для  трейта SoftDeletes: \vendor\laravel\framework\src\Illuminate\Database\Eloquent\SoftDeletes.php


В файле \app\Http\Controllers\Admin\Core.php:
public function getArticles() { 
 $article = Article::find(13); 
 $article->delete();
 
 $articles = Article::all();
 dump($articles);
 }

В БД статья остается, а в колонке  deleted_at появляется время.
Но в коллекции статья больше не отображается. Запись помещена в корзину.

Как ее можно вытащить обратно? Для этого применим метод withTrashed().

public function getArticles() { 
 $articles = Article::withTrashed()->get(); // выбираем все записи вместе с удаленными. 
 
 dump($articles);
 }

Проверим какие записи были удалены:

public function getArticles() {    
        $articles = Article::withTrashed()->get(); // выбираем все записи вместе с удаленными.  
        
        foreach($articles as $article) {
            // если статья была удалена в корзину
            if($article->trashed()) {
                echo $article->id.' Удалена <br />';
            }
            else {
                echo $article->id.' Неудалена <br />';
            }
        }
        
        dump($articles);
    }

Восстановление удаленных записей методом restore().
public function getArticles() { 
 $articles = Article::withTrashed()->restore(); // восстановим удаленные записи.
 
 dump($articles);
 }

Либо так:
 public function getArticles() { 
 $articles = Article::onlyTrashed()->restore(); // восстановим удаленные записи.
 
 dump($articles);
 }
 
В БД в колонке  deleted_at будет написало NULL.

Удалим запись физически при работе с мягким удалением методом forceDelete().

public function getArticles() { 
 $article = Article::find(13);
 $article->forceDelete(); 
 }

1 комментарий:

Materialize-css. Футер

Сделаем футер и прижмем к низу страницы. Документация: https://materializecss.com/footer.html