Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Quyền xem / cập nhật / quản lý tài nguyên lồng nhau của MySQL (bảng tổng hợp)

Để kiểm tra xem mô hình đã cho có liên quan đến mô hình khác hay không, đó là điều bạn muốn nếu tôi hiểu đúng, tất cả những gì bạn cần là phương pháp nhỏ này tận dụng tối đa Eloquent :

(Triển khai nó trong BaseModel , Entity hoặc một phạm vi, bất cứ điều gì phù hợp với bạn)

// usage
$task->isRelatedTo('transactions.users', $id);
// or
$template->isRelatedTo('tasks.transactions.users', Auth::user());

// or any kind of relation:
// imagine this: User m-m Transaction 1-m Item m-1 Group
$group->isRelatedTo('items.transaction.users', $id);

Điều kỳ diệu xảy ra ở đây:

/**
 * Check if it is related to any given model through dot nested relations
 * 
 * @param  string  $relations
 * @param  int|\Illuminate\Database\Eloquent\Model  $id
 * @return boolean
 */
public function isRelatedTo($relations, $id)
{
    $relations = explode('.', $relations);

    if ($id instanceof Model)
    {
        $related = $id;
        $id = $related->getKey();
    }
    else
    {
        $related = $this->getNestedRelated($relations);
    }

    // recursive closure
    $callback = function ($q) use (&$callback, &$relations, $related, $id) 
    {
        if (count($relations))
        {
            $q->whereHas(array_shift($relations), $callback);
        }
        else
        {
            $q->where($related->getQualifiedKeyName(), $id);
        }
    };

    return (bool) $this->whereHas(array_shift($relations), $callback)->find($this->getKey());
}

protected function getNestedRelated(array $relations)
{
    $models = [];

    foreach ($relations as $key => $relation)
    {
        $parent = ($key) ? $models[$key-1] : $this;
        $models[] = $parent->{$relation}()->getRelated();
    }

    return end($models);
}

Này, nhưng chuyện gì đang xảy ra ở đó vậy?

isRelatedTo() hoạt động như thế này:

  1. kiểm tra xem có được thông qua $id không là một mô hình hay chỉ là một id và chuẩn bị $related mô hình và $id của nó để sử dụng trong cuộc gọi lại. Nếu bạn không chuyển một đối tượng thì Eloquent cần khởi tạo tất cả các mô hình liên quan trên $relations (relation1.relation2.relation3... ) để lấy chuỗi mà chúng tôi quan tâm - đó là những gì xảy ra trong getNestedRelated() , khá đơn giản.

  2. thì chúng ta cần làm một cái gì đó như sau:

    // assuming relations 'relation1.relation2.relation3'
    $this->whereHas('relation1', function ($q) use ($id) {
       $q->whereHas('relation2', function ($q) use ($id) {
          $q->whereHas('relation3', function ($q) use ($id) {
             $q->where('id', $id);
          });
       });
    })->find($this->getKey()); 
    // returns new instance of current model or null, thus cast to (bool)
    
  3. vì chúng ta không biết mối quan hệ được lồng vào nhau sâu đến mức nào, nên chúng ta cần sử dụng tiền tệ định kỳ. Tuy nhiên, chúng tôi chuyển một Đóng cho whereHas , vì vậy chúng ta cần sử dụng một mẹo nhỏ để gọi chính nó bên trong phần thân của nó (thực tế là chúng ta không gọi nó, mà chuyển nó dưới dạng $callback đến whereHas vì phương thức này mong đợi một Đóng cửa là tham số thứ 2) - điều này có thể hữu ích cho những người không quen thuộc Các hàm PHP đệ quy ẩn danh :

    // save it to the variable and pass it by reference
    $callback = function () use (&$callback) {
      if (...) // call the $callback again
      else // finish;
    }
    
  4. chúng tôi cũng chuyển đến $relations đóng lại (như một mảng bây giờ) bằng cách tham chiếu để tách các phần tử của nó và khi chúng tôi nhận được tất cả (nghĩa là chúng tôi đã lồng whereHas ), cuối cùng chúng tôi đặt where mệnh đề thay vì một whereHas khác , để tìm kiếm $related của chúng tôi mô hình.

  5. cuối cùng hãy trả về bool



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLAlchemy thông qua Paramiko SSH

  2. Kết hợp bất hợp pháp các đối chiếu (latin1_swedish_ci, COERCIBLE) và (utf8_general_ci, IMPLICIT) cho hoạt động 'find_in_set'

  3. Laravel đầu ra đầu ra khác với truy vấn MySQL

  4. Cách hạn chế giá trị cột trong SQLite / MySQL

  5. Hình ảnh trong MySQL