자신만의 데이터베이스 패키지를 작성하는 방법 (5)

PHPz
풀어 주다: 2017-04-04 14:27:43
원래의
1542명이 탐색했습니다.


기본 아이디어

코딩을 시작하기 전에 우리가 매일 직면하는 문제나 좋지 않은 경험을 떠올려야 합니다

비즈니스 로직을 구현할 때 다음과 같은 유사한 상황이 자주 발생합니다

A씨(id=233)가 회원인지 확인하세요. 그렇다면 '상태' 항목을 '활성'으로 수정하세요. 그렇지 않으면 deleteIt

은 일반적으로 프레임워크가 없을 때 이렇게 작성됩니다(다음 코드는 모든 pdo 로직을 건너뜁니다)

// 首先查询A先生的数据, 获取他的身份
$a = 'select * from users where id = 233';
// 判定是否为会员
if($a->member === true)
    // 是就修改字段
   $b = 'update users set status = 'active' where id = 233';
else
   // 否就删除数据
   $b= 'delete from users where id = 233';
로그인 후 복사

참고로 이는 pdo의 모든 단계를 단순화했기 때문입니다. 좀 더 복잡한 비즈니스 로직을 생각해 보세요. 코드의 가독성은 0이고 재구성은 다음과 같습니다. 무능력
그러면 왜 이렇게 많이 써야 하는 걸까요?

재사용 가능한 데이터

데이터가 반환되면 함수 와 함께 제공되는 인스턴스는 특정 작업을 수행할 수 있습니다

이것이 쿼리 기사에서 반환된 데이터가 변환을 위해 Cast() 함수에 입력되는 이유입니다

패키지를 사용한 후 이렇게 할 수 있습니다

// 首先查询A先生的数据, 获取他的身份
$a = User::find(233);
// 判定是否存在该id和该id是否为会员
if($a & $a->member)
    // 是就修改字段
   $b = $a->update(['status'=>'active']);
else
   // 否就删除数据
   $b= $a->delete();
로그인 후 복사

다음에는

데이터베이스 데이터를 어떻게 수정해야 할까요?

이것 내 자신의 피상적인 대답입니다

일반적인 상황에서는 조건 구문을 사용하여 수정해야 하는 데이터 범위를 지정하고 다시 쓸 필요가 없는 데이터를 필터링해야 합니다

위 설명에 따르면 세 가지 예가 있습니다

  1. 범위를 전혀 지정하지 않고, 테이블의 모든 데이터를 수정

    update Actor set first_name = 'new data'
    로그인 후 복사
  2. 범위를 지정하고, 조건에 맞는 여러 데이터를 수정

    update Actor set first_name = 'new data' where first_name like '%L%'
    로그인 후 복사
  3. 은 범위를 지정하고, ID를 기준으로 지정된 단일 데이터를 수정합니다. key 또는 고유 키

    update Actor set first_name = 'new data' where actor_id = 10
    로그인 후 복사

위의 세 가지 유형을 기반으로 업데이트 기능 개발을 시작할 수 있습니다.
PS: 이해할 수 없습니다/ 경험이 없어서 너무 고급 업데이트 문을 사용해본 적이 없습니다. 메시지 남겨주세요


Builder.php

마지막 줄에 업데이트 기능 추가

// 改写数据库数据
    public function update(array $values) {
        // 如果写保护已经开启,跳出错误
        if($this->writeLock) throw new Exception("data is not allow to update");

        // 编译update语句
        $sql = $this->grammar->compileUpdate($this, $values);

        // 将所有变量的值合成一个数组, 其中包括条件语句部分
        $bindings = array_values(array_merge($values, $this->getBindings()));

        // 返回改写结果,成功true失败false
        return $this->connector->update($sql, $bindings);
    }
로그인 후 복사

Grammar.php

마지막 줄에 compileUpdate 함수 추가

    public function compileUpdate(Builder $query, $values) {
        // 循环$values, 记得引用
        foreach ($values as $key => &$value) 
            // 将所有$value改成对应的$key=?
            $value = $key.' = ?';

        // 将$values中的之全部掏出在连接起来
        $columns = implode(', ', array_values($values));

        // 附上where语句如果有
        // 由于更复杂的sql update语句我还没试过, 为了不坑人, 所以限制只有where语法有效
        // 欢迎提供更复杂的where语句
        $where = is_null($query->wheres) ? '' : $this->compileWheres($query);

        // 返回update语句
        return trim("update $query->from set $columns $where");
    }
로그인 후 복사

Model.php

함수 추가 save, 참조 아래 사용예

// 一种更快捷的update方式
    public function save() {
        return $this->update((array)$this->data);
    }
로그인 후 복사

  • 지정된 데이터 수정

$a = Actor::where('first_name', 'ANGELINA')
    ->update(['last_name'=>'changed']);
dd($a);
로그인 후 복사
  • 데이터 인스턴스 다시 조작

$a = Actor::where('first_name', 'ANGELINA')
    ->first();
dd($a->update(['last_name'=>'again']));
로그인 후 복사
  • 데이터 인스턴스 다시 조작, 또 다른 사용법

$a = Actor::where('first_name', 'ANGELINA')
    ->first();

$a->last_name = 'save';
dd($a->save());
로그인 후 복사

결과 반환

으르르르


위 내용은 자신만의 데이터베이스 패키지를 작성하는 방법 (5)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!