Điểm:0

Cách sử dụng hàm sql MAX() trong truy vấn plugin xem

lá cờ gb

Tôi đang tạo bộ lọc chế độ xem tùy chỉnh cho trường chế độ xem tùy chỉnh. SQL sau đây sẽ thực hiện bộ lọc mà tôi tìm kiếm:

chọn nid, mode_state, content_entity_id, MAX(content_entity_revision_id) 
  từ nút tham gia bên trong content_moderation_state_field_revision trên nid = content_entity_id 
    trong đó content_entity_id = 59 nhóm theo content_entity_id

Trong tệp php plugin bộ lọc chế độ xem của tôi, tôi có đoạn mã sau để thêm sql ở trên vào truy vấn bộ lọc:

/**
   * Hàm trợ giúp xây dựng truy vấn.
   */
  truy vấn hàm công khai() {
    if (!empty($this->value)) {
      $cấu hình = [
        'bảng' => 'content_moderation_state_field_revision',
        'trường' => 'content_entity_id',
        'left_table' => 'node_field_data',
        'left_field' => 'không',
        'toán tử' => '=',
      ];
      $join = Lượt xem::pluginManager('join')->createInstance('chuẩn', $configuration);
      $this->query->addRelationship('content_moderation_state_field_revision', $join, 'node_field_data');
      $this->query->addExpression('MAX(content_moderation_state_field_revision.content_entity_revision_id)');
      $this->query->groupBy("content_moderation_state_field_revision.content_entity_id");
      $this->query->addWhere('AND', 'content_moderation_state_field_revision', $this->value, 'IN');
    }
  }

Lỗi này được tạo ra khi một truy vấn được thực thi:

Lỗi: Gọi đến phương thức không xác định Drupal\views\Plugin\views\query\Sql::addExpression()

Trong khi addExpression() là một phần của api cơ sở dữ liệu cốt lõi nó không được hỗ trợ trong plugin truy vấn lượt xem api sql,

Vì vậy, tôi cần một giải pháp thay thế để thêm biểu thức MAX() vào truy vấn. Có bất cứ đề nghị nào cho việc làm như thế này hả?

Điểm:0
lá cờ gb

Tôi tìm thấy một cách giải quyết!

Mã SQL này về cơ bản mang lại cho tôi những gì tôi đang tìm kiếm:

chọn * từ content_moderation_state_field_revision trong đó (content_entity_id, content_entity_revision_id) trong 
  ( 
    chọn content_entity_id, MAX(content_entity_revision_id) từ nhóm content_moderation_state_field_revision theo content_entity_id 
  ) 
  vàmoderation_state = 'bản nháp'

Lưu ý rằng các hàm MAX và nhóm theo tất cả đều nằm trong truy vấn con SQL, truy vấn này không yêu cầu bất kỳ đầu vào $row nào. Vì vậy, tôi đã tạo một hàm trong mô-đun của mình để xuất kết quả của truy vấn con đó và thêm nó làm điều kiện trong truy vấn bộ lọc plugin. Như thế này:

/**
   * Hàm trợ giúp xây dựng truy vấn.
   */
  truy vấn hàm công khai() {
    if (!empty($this->value)) {
      // Lượt xem plugin xử lý tham gia: https://api.drupal.org/api/drupal/core%21modules%21views%21src%21Plugin%21views%21join%21JoinPluginBase.php/group/views_join_handlers/8.2.x
      $cấu hình = [
        'loại' => 'BÊN TRONG',
        'bảng' => 'content_moderation_state_field_revision',
        'trường' => 'content_entity_id',
        'left_table' => 'node_field_data',
        'left_field' => 'không',
        'toán tử' => '=',
      ];
      $join = Lượt xem::pluginManager('join')->createInstance('chuẩn', $configuration);
      $this->query->addRelationship('content_moderation_state_field_revision', $join, 'node_field_data');     
      $this->query->addGroupBy("content_moderation_state_field_revision.content_entity_id");
      $revision_ids = sbn_moderation_state_sql_subquery(); // trả vềhighest_entity_revision_id
      $this->query->addWhere('AND', 'content_entity_revision_id', $revision_ids, 'IN');
      $this->query->addWhere('AND', 'moderation_state', $this->value, 'IN');
    }
  }

Tôi vẫn có mệnh đề addGroupBy, nhưng tôi không nghĩ nó cần thiết vì hàm MAX nằm trong truy vấn con đảm nhiệm việc trả về content_entity_revision_id cao nhất cho mỗi nút.

Tất nhiên, tôi vẫn không biết cú pháp chính xác để thêm hàm MAX() trong cú pháp truy vấn plugin sql api. Nếu có ai biết, xin vui lòng thêm câu trả lời đó.

Dù sao, bộ lọc hoạt động như một nét duyên dáng -- Tôi có thể lọc chế độ xem theo các nút đã xuất bản hoặc bản nháp hoặc cả hai.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.