팅커콘솔 사용방법 (발전적인 인터프리터)

간단한 로직을 테스트, 기능구현 전 테스트 해볼수 있음 mysql을 하지 않아도....

터미널에서 $>php artisan tinker

 

데이터 조회

파사드 : DB::select('SELECT * FROM test');

쿼리빌더: DB::table('test')->get();

쿼리빌더: DB::table('test')->get(['id','content']); 필요한 컬럼만 찾아온다

쿼리빌더: DB::table('test')->first(); 첫번째 데이터 불러오기

쿼리빌더: DB::table('test')->find(3); 세번째 데이터 불러오기,찾기

쿼리빌더: DB::table('test')->pluck('content'); 해당 컬럼의 내용만 불러오기

쿼리빌더: DB::table('test')->orderBy('id','desc')->get(); 최신순(내림차순)으로 정렬해서 가져오기


where 조건 조회

쿼리빌더: DB::table('test')->where('id', '=',1)->get(); id=1번 데이터 찾기

쿼리빌더: DB::table('test')->where('id', 1)->get(); id=1번 데이터 찾기 =생략

쿼리빌더: DB::table('test')->whereId(3)->get(); id가 3인 데이터를 찾기

쿼리빌더: DB::table('test')->where(function($query) {$query->where('id',1);})->get(); id가 1인 데이터 찾기

 

데이터 입력

파사드: DB::insert('INSERT INTO test (title,content) VALUE (?,?)', ['Hello','Tinker']);

쿼리빌더: DB::table('test')->insert(array('title'=>'test2', 'content'=>'my name is'));

쿼리빌더: DB::table('test')->insert(['title'=>'hihi','content'=>'Hello World']);

쿼리빌더: DB::table('test')->insert(array('title'=>'banana1','content'=>'nice1'),array('title'=>'banana2','content'=>'nice2')); 여러개의 배열을 입력

 

데이터 수정

쿼리빌더: DB::table('test')->where('id',1)->update(array('content'=>'moden')); id값이 1번인 content컬럼의 내용을 moden으로 수정한다

 

데이터 삭제

쿼리빌더: DB::table('test')->where('id',1)->delete(); id값이 1번인 데이터를 삭제한다

쿼리빌더: DB::table('test')->where('id','>',4)->delete(); id값이 4번보다 큰것은 모두 삭제한다

쿼리빌더: DB::table('test')->truncate(); 테이블의 모든데이터를 삭제한다

 

단일데이터 불러오기

쿼리빌더: $result = DB::table('test')->get();

쿼리빌더: $result[0]->title;

데이터 수량가져오기

쿼리빌더: DB::table('test')->count();

 

데이터 최대값,최소값가져오기

쿼리빌더: DB::table('test')->max('id'); 최대값 가져오기

쿼리빌더: DB::table('test')->min('id'); 최소값 가져오기


평균값 수량가져오기

쿼리빌더: DB::table('test')->avg('id'); 평균값 가져오기

'라라벨 > ORM' 카테고리의 다른 글

목록과 관계모델 게시물에 대한 댓글 수 ORM작성하기  (0) 2020.03.26
엘로퀀트 ORM예제  (0) 2019.05.25
엘로퀀드ORM 다대다관계  (0) 2019.04.13

데이터베이스 테이블에 데이터를 심는 행위를 시딩(seeding)이라 한다.

시더만들기

php artisan make:seeder UsersTableSeeder

시더 작성하기

datablses/seeders/UserTableSeeder.php

    public function run()
    {
        App\User::create([
        	'name' => sprintf('%s %s', str_random(3), str_random(4)),
        	'email' => str_random(10). 'example.com',
        	'password' => bcrypt('password'),
        ]);
    }

시더 실행하기

php artisan db:seed --class=UsersTableSeeder

데이터가 심어졌다.


시더 작성 수정하기(모델 팩토리)

datablses/seeders/UserTableSeeder.php

    public function run()
    {
    	factory(App\User::class, 50)->create();
    }
php artisan db:seed --class=UsersTableSeeder

or

php artisan db:seed

users 테이블에 50개의 데이터가 심어졌다.


1부 완료

아래는 마이그레이션과 시딩작업을 같이 하는 내용


모델 팩토리 추가

dababase/factories/ModelFactory.php

$factory->define(App\User::class, function (Faker\Generator $faker) {
    //static $password;

    return [
        'name' => $faker->name,
        'email' => $faker->safeEmail,
        'password' => bcrypt('password'),
        //'password' => $password ?: $password = bcrypt('secret'),
        'remember_token' => str_random(10),
    ];
});
$factory->define(App\Article::class, function (Faker\Generator $faker) {
	$date = $faker->dateTimeThisMonth;

	return [
		'title' => $faker->sentence(),
		'content' =>$faker->paragraph(),
		'created_at' => $date,
		'updated_at' => $date,

	];
});

articles 테이블 시더 뼈대 코드 만들기

php artisan make:seeder ArticlesTableSeeder

소스작성

    public function run()
    {
        $users = App\User::all();

        $users->each(function ($user){
        	$user->articles()->save(
        		factory(App\Article::class)->make()
        	);
        });
    }

마스터 시더 수정

database/seeds/DatebaseSeeder.php

    public function run()
    {
        if(config('database.default') !== 'sqlite'){
        	DB::statement('SET FOREIGN_KEY_CHECKS=0');
        }

        //Model::unguard();

        App\User::truncate();
        $this->call(UsersTableSeeder::class);

        App\Article::truncate();
        $this->call(ArticlesTableSeeder::class);

        //Model::reguard();

        if(config('database.default') !== 'sqlite'){
            DB::statement('SET FOREIGN_KEY_CHECKS=1');
        }

마스터 시더는 외래키 설정으로 인해 순서대로 시딩해줘야 한다. 그래야 오류가 없다.


데이터 베이스 시딩

php artisan db:seed

마이그레이션과 시딩

마이그레이션과 시딩을 한꺼번에 해준다.

php artisan migrate:refresh --seed

'라라벨 > 시더' 카테고리의 다른 글

가짜데이터 맨뒤 점 없애기  (0) 2020.03.30
가짜 유저 추가  (0) 2020.03.30
마스터시더  (0) 2019.05.27
간단하게 데이터를 삽입하는 시더만들기  (0) 2019.05.25

데이터베이스 시스템에서 다대다 관계를 표현하기 위해서는 총 세 개의 테이블이 필요하다.

articles, articles_tag, tags (articles는 일대다 항목에서 생성하였기 때문에 생략하였다.)

마이그레이션 뼈대만들기

php artisan make:migration create_tags_table --create=tags
php artisan make:migration create_article_tag_table --create=article_tag

마이그레이션 열 생성(테이블 컬럼)

databases/migrations/TIMESTAMP_create_tags_table.php

    public function up()
    {
        Schema::create('tags', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('sulg')->index();
            $table->timestamps();
        });
    }

databases/migrations/TIMESTAMP_create_article_tag_table.php

    public function up()
    {
        Schema::create('article_tag', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('article_id')->unsigned();
            $table->integer('tag_id')->unsigned();

            $table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade');
            $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');
            $table->timestamps();
        });
    }

마이그레이션 실행

php artisan migrate

모델관계 연결

php artisan make:model Tag

app\Tag.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tag extends Model
{
    protected $fillable = ['name', 'sulg'];

    public function articles()
    {
    	return $this->belongsToMany(Article::class)
    }
}

Article 모델과 관계를 맺기 위해서 belongsToMany(모델::class)메서드를 이용했다. ("나는 여러개의 article의 소속됩니다.)

 

app\Article.php

    public function tags(){
    	return $this->belongsToMany(Tag::class);
    }

팅커콘솔에서 데이터 삽입

App\Tag::create([
'name' => 'Foo',
'slug' => 'foo',
]);
App\Tag::create([
'name' => 'Bar',
'slug' => 'bar',
]);
App\User::find(2)->articles()->create([
'title' => 'Second article',
'content' => 'Second content',
)];

tags, articles 테이블에 각2개씩 데이터를 삽입한다.


다대다 관계 테스트

$article = App\Article::find(1);
$article->tags()->sync([1,2]);
$article->tags->pluck('name','id');

$article = App\Article::find(2);
$article->tags()->sync([1]);
$article->tags->pluck('name','id');

App\Tag::find(1)->articles;

 

'라라벨 > ORM' 카테고리의 다른 글

목록과 관계모델 게시물에 대한 댓글 수 ORM작성하기  (0) 2020.03.26
엘로퀀트 ORM예제  (0) 2019.05.25
쿼리빌더 명령모음  (0) 2019.04.14

데이터베이스 마이그레이션이란 테이블 스키마의 버전 관리이다.

열 이름을 바꾼다든지 하는 이력을 마이그레이션 코드로 남겨 두고 필요할 때마다 마이그레이션을 실행했다가 롤백하는 작업을 자유롭게 할 수 있다.


테이블 지우기전에 해야할 것

mysql> set foreign_key_checks = 0;

0 : 외래키 설정 끄기

1 : 외래키 설정 켜기

다른 테이블과 관계가 형성되면 오류가 생길 수 있다.

테이블 지우고 난 후에 해야할 것

mysql> set foreign_key_checks = 1; 

마이그레이션 뼈대 만들기

테이블명을 넣어서 만든다.

php artisan make:migration create_posts_table --create=posts

database/migrations 디렉터리에 마이그레이션한 파일이 생성되었다.

아래는 기본 뼈대이다.

<?php

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

class CreateAuthorsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('authors', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('authors');
    }
}

마이그레이션 내용 채우기

이제 기본뼈대에다가 테이블을 채우자

increments메서드는 자동 증가 기본 키이다.

    public function up()
    {
        Schema::create('authors', function (Blueprint $table) {
            $table->increments('id');
            $table->string('titile');
            $table->text('body');
            $table->timestamps();
        });
    }

https://laravel.kr/docs/5.8/migrations

 

라라벨 5.8 - 마이그레이션

라라벨 한글 메뉴얼 5.8 - 마이그레이션

laravel.kr


마이그레이션 실행

데이터베이스의 테이블을 모두 삭제 시킨 다음 마이그레이션을 실행해보자

php artisan migrate

삭제 시켰던 테이블이 다시 생성되었다.

롤백을 실행하면 테이블이 삭제된다.

php artisan migrate:rollback

열추가

authors 테이블에 name 열을 추가해보자

테이블 열 추가 마이그레이션 뼈대 코드를 만들자

php artisan make:migration add_name_to_authors_table --table=authors

아래 처럼 파일이 생성되었을 것이다.

<?php

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

class AddNameToAuthorsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('authors', function (Blueprint $table) {
            //
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('authors', function (Blueprint $table) {
            //
        });
    }
}

여기서 name라는 테이블을 만들어주자. ($table->string('name')->nullable();

    public function up()
    {
        Schema::table('authors', function (Blueprint $table) {
            $table->string('name')->nullable();
        });
    }

저장을 하고 마이그레이션을 실행하자

php artisan migrate

authors에 name컬럼이 생성되었다.


초기화 및 새로고침

php artisan migrate:refresh

'라라벨' 카테고리의 다른 글

CRUD  (0) 2019.05.07
Composer  (0) 2019.04.16
엘로퀀트ORM  (0) 2019.04.01
쿼리빌더  (0) 2019.03.31
데이터베이스 모델(REPL)  (0) 2019.03.31

데이터베이스 시스템에 저장된 데이터를 객체로 표현하기 위한 변환이나, 반대로 객체에 저장된 데이터를

데이터베이스 시스템에 저장하기 위해 데이터를 변환하는 개년을 ORM이라한다.

엘로퀀트는 라라벨이 제공하는 ORM구현체의 이름이다.


테이블을 만들자.

CREATE TABLE AUTHORS(
id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL,
password VARCHAR(60) NOT NULL
) ENGINE=INNODB DEFAULT CHARSET=UTF8 COLLATE=UTF8_UNICODE_CI;

레코드를 삽입하자.

INSERT INTO AUTHORS(email,PASSWORD) VALUES('test@test.com','password')

모델을 만들자.(php artisan)

php artisan make:model Post
php artisan make:model Author

app디렉터리에 파일이 생성되었다.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Author extends Model
{
    //
}

*테이블 이름은 복수로 짓고(authors), 모델 이름은 단수로 짓는다(Author).

관례를 따르지 않을 때는 엘로퀀트에게 알려 주어야한다.

class Author extends Model

{

     protected $table = 'users';

}


모델 쿼리

 

조회

>>> App\Author::get();

결과

=> Illuminate\Database\Eloquent\Collection {#703
     all: [
       App\Author {#705
         id: 1,
         email: "test@test.com",
         password: "password",
       },
     ],
   }

QueryException

모델 파일에 public $timestamps = false; 을 입력해줘야지 쿼리예외 에러가 뜨지 않는다.

인스턴스를 테이블에 저장할 때 현재의 타임스탬프 값을 할당한다. 하지만 테이블에 없는 열(컬럼)이므로 열을 만들거나

엘로퀀트에 자동 입력 기능을 끄는 방법으로 해결해야한다.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Author extends Model
{
    public $timestamps = false;
}

새모델 인스턴스만들고 테이블에 저장하는 방법

$author = new App\Author;
$author->email = > 'sample@sam.com;
$author->password => '1234';
$author->save();

bcrypt(단방향 해시 함수)

비밀번호 찾기가 원칙적으로 불가. 보안상 안전하다.

App\Author::create([
'email' => 'sample@sam.com',
'password' => bcrypt('1234'),
]);

위 처럼 대량 할당을 사용하기 위해서

Author.php파일에 $fillable, $guarded 프로퍼티를 허용하는 코드를 삽입해야한다.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Author extends Model
{
    public $timestamps = false;
    public $fillable = ['title', 'body'];
}

 

'라라벨' 카테고리의 다른 글

Composer  (0) 2019.04.16
데이터베이스 마이그레이션  (0) 2019.04.02
쿼리빌더  (0) 2019.03.31
데이터베이스 모델(REPL)  (0) 2019.03.31
APP_KEY 새로 만들어주기  (0) 2019.03.28

실용적인 데이터베이스를 조작할 수 있게 해준다.

쿼리빌더는 DB::table('posts')와 같이 무조건 table(string $table)메서드로 시작한다.

쿼리문장 끝은 get(), first(), find(), pluck(), insert(), delete(), update() 와 같은 메서드를 사용한다.

 

데이터조회 get()

조회

DB::table('posts')->get();

결과

=> Illuminate\Support\Collection {#699
     all: [
       {#700
         +"id": 1,
         +"title": "Hello Database",
         +"body": "Greetings from tinker",
       },
       {#702
         +"id": 2,
         +"title": "Ola Database",
         +"body": "Saludos de tinker",
       },
     ],
   }

조회

 DB::table('posts')->first();

결과

=> {#705
     +"id": 1,
     +"title": "Hello Database",
     +"body": "Greetings from tinker",
   }

조회

 DB::table('posts')->find(2);

결과

=> {#689
     +"id": 2,
     +"title": "Ola Database",
     +"body": "Saludos de tinker",
   }

조건절

DB::table('posts')->where('id', '=', 1)->get();
DB::table('posts')->where('id',1)->get();
DB::table('posts')->whereId(1)->get();
DB::table('posts')->where(function ($query) {$query->where('id',1);})->get();

결과

=> Illuminate\Support\Collection {#703
     all: [
       {#716
         +"id": 1,
         +"title": "Hello Database",
         +"body": "Greetings from tinker",
       },
     ],
   }
>>>

다른메서드

새 레코드 삽입 : insert(array $values)

DB::table('posts')->insert(array('title'=>'test2','body'=>'test content'));
DB::table('posts')->insert(array(
array('title'=>'test3', 'body'=>'test content'),
array('title'=>'test4', 'body'=>'test content'),
));

데이터 변경 : update(array $values)

DB::table('posts')->where('id',5)->update(array('title'=>'test5'));

레코드 삭제 : delect(int $id)

DB::table('posts')->where('id',5)->delete();
DB::table('posts')->where('id','>',4)->delete(); //id가 4보다 큰 수 삭제한다.
DB::table('posts')->truncate(); //테이블 모두 삭제한다.

컬렉션조회 : pluck(string $column, string $key = null) (컬럼한 종류만 모두 가져온다.) 

변수에 담아서 사용할 수 있다.

$title = DB::table('posts')->pluck('titile');

DB::table('posts')->pluck('title');

한번에 조회할 레코드 개수 : limit(int $value)

 

조회결과 정렬 'asc', 'desc' : orderBy(string $column, string $direction = 'asc')

DB::table('posts')->orderBy('id','desc')->get();   //내림차순

카운트처리

 DB::table('posts')->count();

최대값

 DB::table('posts')->max('id');

최소값

DB::table('posts')->min('id');

평균값

DB::table('posts')->avg('id');

 


https://laravel.kr/docs/5.4/queries

 

라라벨 5.4 - 쿼리 빌더

라라벨 한글 메뉴얼 5.4 - 쿼리 빌더

laravel.kr

 

'라라벨' 카테고리의 다른 글

데이터베이스 마이그레이션  (0) 2019.04.02
엘로퀀트ORM  (0) 2019.04.01
데이터베이스 모델(REPL)  (0) 2019.03.31
APP_KEY 새로 만들어주기  (0) 2019.03.28
dotenv파일 config/database.php 파일 관계  (0) 2019.03.28

mysql 데이터베이스와 테이블 만들기

 

라우팅과 뷰라는 구성 요소를 손에 쥐었다. 

이 두가지만으로도 웹 서비스를 만들 수 있다.

데이터베이스 하나만 더하면 완벽히 동작하는 동적 웹페이지를 만드는데 부족함이 없다.

 

데이터베이스와 테이블을 만들자

CREATE DATABASE db1;
CREATE TABLE posts(
	id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    body TEXT
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


REPL(Read-Evaluate-Print-Loop)

  :콘솔 환경에서 명령을 내리고 실행 결과를 확인하기 위해 사용하는 도구다.

 

팅커(REPL) 콘솔

터미널에서 php artisan tinker 입력하면 팅커콘솔이 작동한다.

>>>

데이터를 조회하기 위해 SELECT 명령어를 입력해보면

에러를 출력한다.

그 이유는 데이터베이스에 접속하기 위한 설정을 하지 않았기 때문이다.(.env)

.env파일을 열어서 데이터베이스 접속 설정을 한다.


SELECT

팅커콘솔을 재시작하고 SELECT명령어를 입력해보자

DB::select('SELECT * FROM posts');

[]의 의미는 쿼리결과가 없다는 의미이다. 아무 데이터가 없기 때문이다.

select 결과를 $posts변수에 담아보자

 $posts = DB::select('SELECT * FROM posts');
 $posts[1]->body;

컬렉션이 아니라 단일 데이터 인스턴스를 얻으려면 selectOne(string $query, array $bindings)메서드를 이용한다.

 $post = DB::selectOne('SELECT * FROM posts WHERE id = ?',[1]);

INSERT

 DB::insert('INSERT INTO posts(title, body) VALUES(?,?)',['Hello Database', 'Greetings from tinker']);

데이터가 잘 입력되었다.

 


 

'라라벨' 카테고리의 다른 글

엘로퀀트ORM  (0) 2019.04.01
쿼리빌더  (0) 2019.03.31
APP_KEY 새로 만들어주기  (0) 2019.03.28
dotenv파일 config/database.php 파일 관계  (0) 2019.03.28
라라벨5.3버전 프로젝트 구조  (0) 2019.03.28

블레이드로 정의된 뷰에서 다른 조각 뷰를 가져다가 삽입 할 수 있다.

resources/views/partials/footer.blade.php 를 만든다.

<footer>
	<p>저는 꼬리말입니다. 다른 뷰에서 저를 입양해 가요.</p>
</footer>

불러올 파일에서 @include('partials.footer') 입력해준다.


@parent

부모뷰 @yield('script') 에 자식뷰,조각뷰의 이름이 똑같다고 가정해본다면....

조각뷰하나만 출력이 될 것이다.

이러면 이름을 script 로 뒤에 script1을 붙여서 중복을 제거해야한다.

@parent 를 삽입해주면 된다.

@section('script')
@parent
	<script type="text/javascript">
		alert('조각뷰의 자바스크립트 섹션 입니다.')
	</script>
@endsection

'라라벨 > 블레이드템플릿' 카테고리의 다른 글

템플릿 상속(@extends)  (0) 2019.03.31
블레이드 문법 if문, for문  (0) 2019.03.31
블레이드문법 {{ $변수 }}  (0) 2019.03.30

+ Recent posts