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

Nhiều khóa ngoại vào cùng một bảng Gas Orm

Tôi không biết, nếu chủ đề này vẫn còn cập nhật và thú vị đối với một số bạn, nhưng nói chung, tôi đã gặp cùng một vấn đề.

Tôi quyết định Gas ORM trở thành người lập bản đồ của mình kết hợp với CodeIgniter. Vì cấu trúc cơ sở dữ liệu của tôi đã được cung cấp và nó không tuân theo quy ước table_pk của Gas, nên tôi phải xác định khóa ngoại của chính tôi mà sẽ tham chiếu đến khóa ngoại cơ sở dữ liệu tùy chỉnh của tôi. Tuy nhiên, định nghĩa của nó không ảnh hưởng đến bất cứ điều gì. Giống như lỗi của bạn ở trên, trình ánh xạ không thể tạo câu lệnh SQL phù hợp. Tuyên bố trông tương tự như của bạn:

   SELECT * FROM partner WHERE partner.pool_id IN (1)

Chà, có vẻ như Gas bỏ qua các khóa ngoại tự định nghĩa và cố gắng sử dụng quy ước table_pk mặc định. Điều này có nghĩa là, nó lấy bảng (trong trường hợp của bạn là:pool) và khóa chính (id) bằng cách hợp nhất nó với một ký tự gạch dưới.

Tôi đã phát hiện ra rằng hàm tạo của orm.php xử lý mọi khóa chính và khóa ngoài được xác định trong các thực thể. Trong dòng 191, mã gọi một mệnh đề if kết hợp với trống chức năng của php. Vì khóa chính luôn được định nghĩa và không có phủ định trong câu lệnh, nên nó luôn bỏ qua phần bên trong của mệnh đề. Tuy nhiên, phần bên trong sẽ đảm nhận các khóa ngoại tự xác định.

Truyện dài ngắn, Tôi đã thêm một phủ định (!) ở dòng 191 của orm.php dẫn tôi đến mã sau:

if ( ! empty($this->primary_key))
    {
        if ( ! empty($this->foreign_key))
        {
            // Validate foreign keys for consistency naming convention recognizer
            $foreign_key = array();

            foreach($this->foreign_key as $namespace => $fk)
            {
                $foreign_key[strtolower($namespace)] = $fk;
            }

            $this->foreign_key = $foreign_key;
        }
        else
        {
            // If so far we didnt have any keys yet, 
            // then hopefully someone is really follow Gas convention
            // while he define his entity relationship (yes, YOU!)
            foreach ($this->meta->get('entities') as $name => $entity)
            {
                if ($entity['type'] == 'belongs_to')
                {
                    $child_name     = $entity['child'];
                    $child_instance = new $child_name;
                    $child_table    = $child_instance->table;
                    $child_key      = $child_instance->primary_key;

                    $this->foreign_key[strtolower($child_name)] = $child_table.'_'.$child_key;
                }
            }
        }
    }

Chà, sửa chữa nhỏ này đã giúp tôi rất nhiều và tôi hy vọng một số bạn cũng có thể tận dụng gợi ý này.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm kiếm biểu tượng cảm xúc trong MySQL

  2. cấp tệp chỉ trên một cơ sở dữ liệu

  3. Truy vấn SQL nào tốt hơn, PHÙ HỢP VỚI LẠI hay THÍCH?

  4. Vòng lặp While trong PHP chỉ hiển thị hàng cuối cùng

  5. Thay đổi số lượng hiện tại của một giá trị Tự động tăng trong MySQL?