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

sails.js Truy vấn kế hoạch chi tiết theo quan hệ

Tôi không nghĩ rằng nó có thể làm được với SailsJS 0.10.5 vào lúc này. Trên thực tế, tôi cũng muốn làm điều tương tự, vì vậy tôi quyết định thực hiện một bản hack nhanh chóng cho mục đích này.

Mở tệp sails/lib/hooks/blueprints/actionUtil.js , chỉnh sửa phương thức populateEach như bên dưới:

populateEach: function ( query, req ) {
    var DEFAULT_POPULATE_LIMIT = sails.config.blueprints.defaultLimit || 30;
    var _options = req.options;
    var aliasFilter = req.param('populate');
    var shouldPopulate = _options.populate;

    // Convert the string representation of the filter list to an Array. We
    // need this to provide flexibility in the request param. This way both
    // list string representations are supported:
    //   /model?populate=alias1,alias2,alias3
    //   /model?populate=[alias1,alias2,alias3]
    if (typeof aliasFilter === 'string') {
        aliasFilter = aliasFilter.replace(/\[|\]/g, '');
        aliasFilter = (aliasFilter) ? aliasFilter.split(',') : [];
    }

    return _(_options.associations).reduce(function populateEachAssociation (query, association) {        
        // If an alias filter was provided, override the blueprint config.
        if (aliasFilter) {
            shouldPopulate = _.contains(aliasFilter, association.alias);
        }

        // Only populate associations if a population filter has been supplied
        // with the request or if `populate` is set within the blueprint config.
        // Population filters will override any value stored in the config.
        //
        // Additionally, allow an object to be specified, where the key is the
        // name of the association attribute, and value is true/false
        // (true to populate, false to not)
        if (shouldPopulate) {
            // IMPORTANT NOTE: This is my trick. We should take advanced options from request parameter to make requests even more flexible
            var populationOptions = req.param('populate_' + association.alias);

            if (!populationOptions) {
                var populationLimit = _options['populate_' + association.alias+'_limit'] ||
                                      _options.populate_limit ||
                                      _options.limit ||
                                      DEFAULT_POPULATE_LIMIT;
                populationOptions = {limit: populationLimit};
            }

            return query.populate(association.alias, populationOptions);
        }
        else { 
            return query;
        }
    }, query);
},

Yay! Giờ đây, API của bạn có thể xử lý các bộ lọc liên kết bổ sung như bên dưới:

# POST /api/documents
{
    "where" : {
        // Normal conditions
    }
    "populate_user": {
        // Advanced condition for association 'admin'
        "where" : {
            "role" : {
                 "like": "%Admin%"
            }
        },
        "limit" : 4    
     }
}

Tôi hy vọng rằng nó sẽ giúp. Nhân tiện, tôi sẽ tìm thời gian để gửi một yêu cầu kéo về cải tiến này đến lõi SailsJS vào ngày mai.

P / S:Phần lõi của SailsJS được làm khá tốt. Có lẽ những người cam kết cốt lõi quá bận rộn để xử lý tất cả các yêu cầu tính năng. Hãy đóng góp!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tìm lần xuất hiện đầu tiên và cuối cùng của một ký tự cụ thể bên trong một chuỗi trong PostgreSQL

  2. LỖI:hàng quá lớn:kích thước 8168, kích thước tối đa 8164

  3. Lọc theo phạm vi ngày (cùng tháng và ngày) qua các năm

  4. PostgreSQL trên Docker:Cách cài đặt và chạy các phần phụ thuộc của python trong `plpython3u`?

  5. Gây ra bởi:org.hibernate.MappingException:Cột lặp lại trong ánh xạ cho thực thể