Điểm:2

Làm cách nào để sử dụng các giá trị của thực thể được tham chiếu trong TableSort?

lá cờ ai

Tôi có một thực thể tùy chỉnh với trường được xác định như sau.

$fields['file'] = BaseFieldDefinition::create('file')
  ->setDescription('Tham chiếu đến loại thực thể Tệp lõi tích hợp sẵn.')
  ->setLabel('Tệp')
  -> thiết lậpBắt buộc(TRUE)
  ->setSetting('file_extensions', 'pdf rtf doc docx')
  ->setSetting('max_filesize', '20MB')
  ->setSetting('description_field', TRUE)
  ->setDisplayOptions('form', ['type' => 'file'])
  ->setDisplayOptions('view', ['type' => 'file']);

Tôi không gặp vấn đề gì khi truy cập vào các trường được tham chiếu Tập tin thực thể từ các phiên bản của loại thực thể của riêng tôi. Vì vậy, ví dụ, những dòng này hoạt động như mong đợi.

$filename = $my_entity->file->entity->filename->value;
$username = $my_entity->file->entity->uid->entity->name->value;

Khi tôi cố gắng sử dụng các trường của tham chiếu Tập tin thực thể với một BảngSắp xếp, mà tôi muốn đưa vào một truy vấn thực thể trên loại thực thể tùy chỉnh của mình, mã sẽ đưa ra một ngoại lệ.

$header['tên'] = [
  'dữ liệu' => 'Tên tệp',
  'trường' => 'tệp.thực thể.tên tệp',
  'specifier' => 'file.entity.filename',
];
$header['người dùng'] = [
  'dữ liệu' => 'Được tải lên bởi',
  'trường' => 'file.entity.uid.entity.name',
  'specifier' => 'file.entity.uid.entity.name',
];

// â¦

$query->tableSort($header);

Uncaught PHP Ngoại lệ Drupal\Core\Entity\Query\QueryException: "không tìm thấy 'tệp'"

Đối với cú pháp của tiêu đề $ mảng Tôi chủ yếu dựa vào manh mối mà tôi có được từ Sắp xếp bảng với EntityQuery, trong đó Berdir khuyên chúng ta nên xem xét trọng tải()buildHeader() phương pháp của UserListBuilder lớp. Thật không may, ví dụ đó dường như đang sử dụng các giá trị trường được lưu trữ trực tiếp trong bảng cơ sở, vì vậy tôi đang dựa vào giả định rằng, vì chúng ta đang ở trong vùng truy vấn thực thể, nên cú pháp tương tự được mô tả trong Giao diện truy vấn::điều kiện() rất mong đợi.

Tôi đã xem xét một số vấn đề mở, chẳng hạn như Sắp xếp bảng bỏ qua "trường", luôn thêm tiêu đề tiêu đề làm tham số truy vấn đơn hàngdọn dẹp bàn ăn, nhưng tôi không thấy bất cứ điều gì làm sáng tỏ vấn đề.

lá cờ cn
Nó chắc chắn được hỗ trợ với cú pháp bạn đang sử dụng, vì điều này hoạt động tốt đối với các nút sử dụng, ví dụ:. `uid.entity.name` làm công cụ xác định. Bạn có gặp sự cố khi cài đặt trường tệp này không? Hoặc có thể thay đổi nó sau khi cài đặt? Thay đổi cardinality, loại điều đó?
lá cờ ai
@Clive - Không có vấn đề gì khi cài đặt trường và không có sửa đổi nào được thực hiện đối với cấu hình của nó. Tôi có thể điền vào trường một cách hoàn hảo khi tạo hoặc cập nhật các thực thể và có thể truy cập vào bất kỳ thuộc tính nào của trường bằng cách sử dụng cú pháp truy cập trường thực thể tiêu chuẩn. Bạn có nghĩ rằng tôi có nên gửi một báo cáo lỗi (với một trường hợp repro) không?
lá cờ cn
Tôi không chắc đó là lỗi hay chỉ là thứ gì đó không có giấy tờ, có một cú pháp hoạt động cho các trường tệp cơ sở. Tôi đã đưa ra câu trả lời nhưng hy vọng tôi sẽ cập nhật nó khi có thời gian để tìm hiểu thêm
lá cờ ai
@Clive - Trước hết, tôi _rất_ ấn tượng rằng bạn đã tìm ra điều này. Tôi đã cập nhật [báo cáo lỗi](https://www.drupal.org/project/drupal/issues/3278083) của mình để phản ánh thông tin mới này. Phiên bản ngắn: đó là một lỗi trong tài liệu hoặc phần mềm và tôi tin rằng trường hợp mạnh hơn có thể được thực hiện để làm cho phần mềm tuân theo cú pháp hiện được ghi lại cho loại trường tham chiếu lõi _any_. Tôi chấp nhận câu trả lời tuyệt vời của bạn, ngay cả trước khi bạn có cơ hội cập nhật nó.
Điểm:2
lá cờ cn

Có một lỗi trong lõi và hiện tại cách giải quyết là:

'specifier' => 'file.target_id.entity.filename',

Lý do cho điều này là cú pháp mối quan hệ truy vấn thực thể bắt đầu dưới dạng hỗ trợ tham gia, nó có trước hỗ trợ tham chiếu thực thể trong lõi và như vậy trong khi $entity->file->target_id->entity không được hỗ trợ bởi lõi, file.target_id.entity được hỗ trợ bởi truy vấn thực thể để cho biết nó sẽ tham gia thực thể được chỉ định bởi tập tin trường và id thực thể phải là những gì được chỉ định bởi target_id. Nó hơi rắc rối nhưng vào thời điểm đó, nó đã hoạt động.

Nên có thể tìm ra file.entity.filename cũng bởi vì tên thuộc tính chính cho tập tin trường xảy ra là target_id và vì vậy nó có thể mở rộng nó cho bạn thành file.target_id.entity.filename. Tuy nhiên, lớp trong trường hợp Drupal\Core\Entity\Query\Sql\Tables cực kỳ phức tạp và bản mở rộng này có một lỗi đối với trường hợp bảng dùng chung sẽ được sửa trong https://www.drupal.org/project/drupal/issues/3278083

lá cờ ai
Vì vậy, bạn đang đề xuất đó là tài liệu cần được sửa chứ không phải mã? Sẽ không phải là lần đầu tiên.
lá cờ ai
Tôi chấp nhận câu trả lời xuất sắc của bạn, mặc dù tôi không chắc mình hiểu ý của bạn trong lời giải thích của bạn.Tôi có vô số ví dụ về điều kiện tham chiếu thực thể trong các truy vấn thực thể dựa trên trường tham chiếu được lưu trữ trong bảng cơ sở và chúng hoạt động tốt với cú pháp được ghi lại.
lá cờ cn
Vâng, tham chiếu thực thể vani dưới dạng trường cơ sở dường như hoạt động như bạn mong đợi. Nếu tôi là một người cá cược, nếu không nhìn kỹ, tôi sẽ nói rằng có thể là do trường tham chiếu thực thể cơ sở chỉ có một cột DB duy nhất (`target_id`), vì vậy sẽ không cần cú pháp để hỗ trợ "các trường phụ “; có thể suy ra cột `fieldname__target_id` (nhân tiện, các trường phụ có thể KHÔNG phải là thuật ngữ chính thức :)). Các trường tệp có 3 cột DB, do đó, các truy vấn cần phải được thông báo rõ ràng cột `file__*` nào trong bảng cơ sở cần được sử dụng, do đó sẽ sử dụng cú pháp khác. Vẫn có thể là một cái gì đó khác mặc dù
lá cờ cn
Đã tìm thấy nó - `DefaultTableMapping::getFieldColumnName()` là khẩu súng hút thuốc. Nếu một trường chỉ có một cột, tên cột DB của nó là tên của trường. Vì vậy, một trường tham chiếu thực thể có ID là `uid`, có một cột DB có tên là `uid`. Khi bạn truy vấn `uid.entity.*`, tên cột DB sẽ khớp thẳng và mọi thứ đều ổn. Khi một trường có nhiều hơn một cột, các cột DB được đặt tên là `tên_trường_tên_thuộc tính`, vì vậy khi bạn truy vấn `tên trường.thực thể`, sẽ không có cột DB `tên_trường` phù hợp. Cú pháp mở rộng có sẵn để thu hẹp khoảng cách đó và cho phép bạn chọn đúng cột
lá cờ ai
Cảm ơn vì trò chơi tuyệt vời này. Tôi sẽ bao gồm một liên kết đến trang này từ báo cáo lỗi.
Smartsheet eng avatar
lá cờ um
Đây là một giải pháp thay thế hoạt động nhưng không phải là nguyên nhân khiến `fieldname.entity.propertyname` không hoạt động. Nguyên nhân là nếu 1) trường có nhiều cột 2) được lưu trữ trong bảng dùng chung 3) và được sử dụng trong truy vấn trong đó các chỉ định theo tên trường -- thì mã ánh xạ bảng hoàn toàn không được gọi. Có một lỗi trong Tables. Tôi để lại một câu trả lời và gửi một bản vá. Ngoài ra, "đơn giản là hệ thống không biết tệp là gì." nó chắc chắn biết, đó là một lĩnh vực. Mã này không gọi `$sql_column = $table_mapping->getFieldColumnName($field_storage, $column);` đây là trường hợp cạnh rất hiếm.
lá cờ cn
@Smartsheeteng Thật vậy, một lỗi có thể dễ dàng là lý do _hệ thống đơn giản là không biết tệp là gì_ tại thời điểm đó (không biết, ánh xạ bảng không chứa `file`, chúng chứa `file__*`)
Smartsheet eng avatar
lá cờ um
@Clive hệ thống biết tệp là gì, đó là một trường. Bạn đang xem nhầm lớp, lỗi nằm ở Bảng chứ không phải lớp ánh xạ. Lỗi rất lớn là lớp không được gọi ngay từ đầu cho trình xác định này. Câu trả lời này hoàn toàn sai, tôi sẽ chỉnh sửa và xóa câu trả lời của tôi vì nó không cần thiết.
lá cờ cn
@Smartsheeteng Tôi không nhận ra bạn đã viết mã gốc, đủ công bằng, hãy chỉnh sửa câu trả lời
Điểm:1
lá cờ ai

Lỗi được mô tả ở trên dường như là kết quả của một bọ cánh cứng bên trong Mục tệp cắm vào. Mặc dù plugin loại trường khiếu nại nó là một tham chiếu thực thể (các @Loại lĩnh vực chú thích nói danh mục = @Bản dịch ("Tham khảo")), và trong tất cả các khía cạnh khác, đó là sự thật, sự hỗ trợ cho cú pháp truy vấn thực thể tài liệu bị phá vỡ.

Cho đến khi lỗi được khắc phục, giải pháp thay thế sẽ là từ bỏ chuyên môn hóa được thực hiện bởi Mục tệp loại trường và sử dụng một đồng bằng thực thể_reference lĩnh vực thay thế. Với sự thay đổi đó BảngSắp xếp mã ở trên hoạt động chính xác.

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