Điểm:2

Sử dụng API truy vấn thực thể để xác định các thực thể có giá trị tương quan

lá cờ ai

Hãy tưởng tượng hai loại thực thể tùy chỉnh Drupal 9 được đặt tên mộtb.

loại thực thể một có hai lĩnh vực a_f1a_f2.

loại thực thể b có một lĩnh vực ba đó là một tham chiếu thực thể với loại mục tiêu là một và số lượng không giới hạn.

Làm cách nào để tạo một truy vấn thực thể tìm thấy tất cả các thực thể thuộc loại b ít nhất một trong số đó ba tham chiếu thực thể trỏ đến một một thực thể có giá trị 'v1' cho trường của nó a_f1 và giá trị 'v2' cho trường của nó a_f2?

Nó không thích hợp trong trường hợp này để tìm một b trong đó có một tham chiếu thực thể trỏ đến một một thực thể với a_f1 của 'v1' nhưng a_f2 của 'cái gì khác' và một tham chiếu thực thể khác trỏ đến một thực thể khác một thực thể với a_f2 của 'v2' nhưng a_f1 của 'giá trị sai'.

Tôi có thể làm điều này trong giấc ngủ với các truy vấn SQL trực tiếp, nhưng điều đó không được chấp nhận trong thế giới Drupal. Tôi đang gặp khó khăn trong việc tìm hướng dẫn để làm điều này Cách Drupal trong tài liệu chính thức của Drupal.

API truy vấn thực thể Drupal có hỗ trợ chức năng này không?

Điểm:3
lá cờ us

Đoạn mã sau sẽ đạt được những gì được mô tả trong câu hỏi.

$result = \Drupal::entityQuery('b')
  ->điều kiện('b_a.thực thể:a.a_f1', 'v1')
  ->điều kiện('b_a.thực thể:a.a_f2', 'v2')
  ->thực thi();

Trong chuỗi đầu tiên được chuyển đến điều kiện, tình trạng, trạng thái():

  • ba là tên trường
  • .thực thể:a nói rằng trường đó là một tham chiếu thực thể cho một một thực thể
  • a_f1a_f2 là các trường cho một thực thể

Để biết thêm thông tin về các giá trị được chấp nhận cho lần đầu tiên điều kiện, tình trạng, trạng thái() lập luận, xem Giao diện truy vấn::điều kiện().

trong trường hợp ba trường là một trường đa giá trị, cả hai điều kiện sẽ tham chiếu đến cùng một delta, có nghĩa là giá trị của a_f1A_f2 các trường được lấy từ cùng một một thực thể.
Mã tôi đã viết ở đầu câu trả lời trả về tất cả các thực thể đáp ứng cả hai điều kiện. Nếu bạn muốn lấy tất cả các thực thể mà một trong các điều kiện là đúng, thì bạn nên sử dụng đoạn mã sau.

$query = \Drupal::entityQuery('b');
$group = $query->orConditionGroup()
  ->điều kiện('b_a.thực thể:a.a_f1', 'v1')
  ->điều kiện('b_a.entity:a.a_f2', 'v2');
$result = $query->condition($group)->execute();
lá cờ ai
Thật tuyệt vời! Cảm ơn rất nhiều. Rõ ràng tôi không có quyền trên trang web này để nâng cao câu trả lời của bạn hoặc tôi sẽ làm điều đó, nhưng tôi đã đánh dấu nó là câu trả lời đúng (sau khi tạo và thử nghiệm trường hợp phản đối). Điều này làm chính xác những gì tôi cần nó để làm. Có tài liệu nào giải thích rằng API sẽ đảm bảo rằng cả hai giá trị phải đến từ cùng một thực thể được tham chiếu không? Và nó có giải thích cách xây dựng truy vấn cho trường hợp tôi cần tìm các thực thể `b` tham chiếu đến `a` có `a_f1 = 'v1'` **và** có `a` trong đó `a_f2 = 'v2'` nhưng chúng không nhất thiết phải là các thực thể `a` giống nhau?
apaderno avatar
lá cờ us
Tôi sẽ mở rộng câu trả lời vào ngày mai (đối với tôi thì đã gần nửa đêm), nhưng tôi có thể nói rằng đối với mã tôi đã hiển thị, cả hai điều kiện phải đúng đối với từng thực thể được trả về. Hiện tại, câu trả lời không xem xét trường đa giá trị.
lá cờ ai
Tôi đã xác nhận (bằng thử nghiệm) rằng phương pháp này hoạt động theo cách tương tự đối với các trường đa lần xuất hiện có nhiều giá trị (tất cả các giá trị đã chỉ định phải xuất hiện trong cùng một lần xuất hiện của trường để thực thể mẹ được đưa vào kết quả truy vấn). Nếu bạn biết tài liệu giải thích tất cả điều này đang ẩn ở đâu, vui lòng đăng một liên kết. Tôi hứa sẽ rất xấu hổ nếu nó nằm trong tầm nhìn rõ ràng và tôi đã bỏ lỡ nó. :-)
apaderno avatar
lá cờ us
Tôi mở rộng câu trả lời. Những gì tài liệu nói là hai điều kiện cho cùng một trường đa giá trị đề cập đến cùng một delta. điều đó có nghĩa là điều kiện đầu tiên cho `b_a.entity:a` không thể đề cập đến mục đầu tiên và điều kiện thứ hai cho `b_a.entity:a` cho mục thứ ba.
lá cờ ai
Tôi sẽ bỏ qua các hướng dẫn ở đây, hướng dẫn tôi tránh đăng bình luận "cảm ơn". :-) Tôi rất đánh giá cao thông tin bạn đã cung cấp, cũng như liên kết đến tài liệu (mà lẽ ra tôi phải tự mình tìm thấy). Và bây giờ có vẻ như tôi đã (bằng cách đăng nhận xét) đã có đủ điểm "danh tiếng" để nâng cao câu trả lời của bạn, điều mà tôi đã thực hiện. Cảm ơn!
apaderno avatar
lá cờ us
Đôi khi, trang tài liệu rõ ràng hơn không phải là nơi bạn tìm thấy thông tin mà bạn đang tìm kiếm. Đó là lý do tại sao đôi khi chúng ta không nhìn vào điều đó. Nó cũng xảy ra với tôi.

Đă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.