2010-02-13 15 views
6

Trong ứng dụng tôi đang xây dựng, người dùng có thể xác định mối quan hệ giữa các bảng.Làm cách nào để thêm mối quan hệ vào thời gian chạy bằng DBIx :: Class và Catalyst?

Vì tôi chỉ xác định điều này khi chạy, tôi không thể chỉ định has_many hoặc thuộc về các mối quan hệ trong mô-đun lược đồ để khởi động.

Vì vậy, được cung cấp hai bảng; hệ thống và địa điểm, tôi muốn thêm mối quan hệ để tham gia các bản ghi giữa chúng.

tôi có một phần của giải pháp dưới đây:

$rs = $c->model('DB::system')->result_source; 
$rs->add_relationship('locations','DB::place',{'foreign.fk0' => 'self.id'}); 

Vì vậy, các cột fk0 sẽ là bản đồ chính nước ngoài để chính vị trí chủ chốt id.

Tôi biết phải đăng ký lại để cho phép truy cập vào mối quan hệ trong tương lai nhưng tôi không thể hiểu được.

+3

Bạn có chắc chắn người dùng thực sự thay đổi giản đồ cơ sở dữ liệu không? Điều đó hoàn toàn tương đương với việc cho phép họ chỉnh sửa mã nguồn. Bạn không nhất thiết phải mô hình hóa "giao diện người dùng" của mình với DBIx :: Class. Bạn có thể muốn phát triển một số biểu diễn trung gian cung cấp các chức năng mà bạn muốn, và giữ cho mã của bạn và lược đồ cơ sở dữ liệu cố định. – jrockway

+1

Ngoài ra còn có DBIx :: Class :: Schema :: Loader, nếu bạn đang theo dõi một cơ sở dữ liệu thay đổi bạn không kiểm soát, hoặc một cái gì đó như thế. Nhưng hãy nhớ, các thay đổi lược đồ cơ sở dữ liệu sẽ thay đổi hành vi của ứng dụng của bạn. Nếu mã của bạn là tĩnh và lược đồ cơ sở dữ liệu của bạn là động, thì gần như chắc chắn có điều gì đó sai. – jrockway

+0

Tôi đang khám phá khả năng sử dụng lược đồ/từ điển dữ liệu của riêng mình được phủ lên cơ sở dữ liệu thực tế. Tôi có bảng 'cột' và bảng 'bảng'. Chúng được sử dụng để ánh xạ các tên và các cột thuộc tính người dùng đã chọn vào một vùng bảng chung chung bên dưới. Như vậy, người dùng có thể chọn thêm mối quan hệ giữa các bảng vào thời gian chạy. Tôi muốn truy cập mối quan hệ này qua DBIx. Tôi đang xây dựng giao diện trung gian để ẩn lược đồ chung và cần khả năng này. Cảm ơn, -Joe – Joe

Trả lời

1

Tôi không tin rằng bạn có thể xác định lại các mối quan hệ này sau khi ứng dụng đang chạy. Ít nhất không phải không loại bỏ bất kỳ đối tượng DBIC hiện có nào và tạo lại chúng từ đầu. Tại thời điểm đó, nó sẽ dễ dàng hơn để chỉ bắt đầu lại ứng dụng của bạn, tôi nghi ngờ.

Nếu bạn đang xác định nội dung những điều này một cách năng động tại biên dịch thời gian, có thể ... chúng tôi làm điều gì đó tương tự trong một trong các ứng dụng của chúng tôi.

Nếu điều đó có ích cho bạn, tôi có thể cung cấp một số mã mẫu.

Mô-đun DBIx::Class::ResultSet::View có thể cung cấp xấp xỉ gần đúng những gì bạn đang tìm kiếm, bằng cách cho phép bạn thực thi mã tùy ý, nhưng truy xuất kết quả dưới dạng đối tượng DBIx.

Ý kiến ​​chung của tôi về những thứ như thế này, là bất kỳ lớp trừu tượng nào (và ORM là lớp trừu tượng), được thiết kế để làm cho cuộc sống dễ dàng hơn. Khi nó làm theo cách làm cho ứng dụng của bạn làm những gì nó muốn, nó không còn làm cho cuộc sống dễ dàng hơn, và nên được loại bỏ (để sử dụng cụ thể đó - không nhất thiết cho mọi lần sử dụng). Vì lý do này, tôi sẽ đề nghị sử dụng DBI, như bạn đã đề xuất trong một trong các ý kiến ​​của bạn. Tôi nghi ngờ nó sẽ làm cho cuộc sống của bạn dễ dàng hơn nhiều trong trường hợp này.

+0

+1 cho nhận xét "khi nhận được thông báo ...". Một trong những lý do tôi vẫn thích Class :: DBI hơn DBIC - tôi không thấy nó bị cản trở. – RET

0

Tôi đã thực hiện việc này bằng cách gọi các phương thức thích hợp trên các nguồn kết quả có liên quan, ví dụ: $resultset->result_source-><relationship method>. Nó hoạt động ngay cả trong một ứng dụng đang hoạt động.

Các vấn đề liên quan