2013-03-23 8 views
12

Tôi có một bảng câu chuyện và bảng người dùng. Userid cột trong bảng câu chuyện là một khóa ngoại trong đó tham chiếu id trong bảng người dùng.Học thuyết quan hệ nhiều đến một liên tục hoạt động

Tôi đã đặt mối quan hệ là người dùng có thể có nhiều câu chuyện được lưu trữ trong bảng câu chuyện. Tôi đã tạo ra các thực thể của cả hai bảng.

Nhưng nếu cố gắng duy trì hoạt động chỉ với bảng câu chuyện, nó sẽ hỏi chi tiết về mục nhập người dùng mới.

Mục tiêu của tôi là thêm một câu chuyện mới với userId hiện có.

Am đăng các lỗi ở đây:

Một thực thể mới được tìm thấy thông qua các mối quan hệ 'Câu chuyện # _userId' rằng không được cấu hình để thác kiên trì hoạt động cho tổ chức: User @ 0000000038960c50000000008ea93852. Để giải quyết vấn đề này: Hoặc là gọi EntityManager # persist() trên thực thể không xác định này hoặc định cấu hình thác vẫn tồn tại liên kết này trong ánh xạ ví dụ @ManyToOne (.., cascade = {\ "persist \"}).

tôi đặt mối quan hệ ManyToOne trong Story thực thể:

/** 
* @ManyToOne(targetEntity="User", inversedBy = "_story") 
* @JoinColumns({ 
*  @JoinColumn(name="user_id", referencedColumnName="id") 
* }) 
*/ 

private $_userId; 

Tôi đã kiểm tra cấu trúc CSDL và nó cho thấy mối quan hệ được thiết lập một cách chính xác. Vì vậy, tôi đã thực hiện quá trình chèn câu chuyện.

$user = new User(); 
$user->setUserId($id); 
$story = new Story(); 
$story->setContent("...."); 
$story->setUserid($user); 
$this->em->persist($story); 
$this->em->flush(); 

Trả lời

0

Tôi đang đấu tranh để hiểu những gì bạn cần, vì vậy tôi không chắc liệu điều này có phản hồi cho câu hỏi của bạn hay không.

Là story.user_id id khóa ngoại của user.id (là khóa chính), không được để trống/rỗng. Vì vậy, nếu, giả sử bạn có phiên php, bạn có thể lưu trữ id người dùng (hoặc tên người dùng) trong biến phiên của bạn và khi bạn tạo bản ghi mới trong bảng câu chuyện, hãy sử dụng id người dùng từ phiên của bạn để điền thuộc tính story.user_id.

Hy vọng điều đó sẽ hữu ích.

+0

Cảm ơn bạn đã phản hồi.Nhưng tôi cần phải làm những điều trong học thuyết. – Sujith

0

Tôi sẽ hữu ích nếu bạn đính kèm các điều khoản của mình.

Nhưng tôi cho rằng đó là vấn đề tương tự với tôi. Bạn không thể xác định @Id và @ManyToOne cùng nhau trong một trường. Bạn phải sử dụng các trường riêng biệt cho một @Id và cho mối quan hệ @ManyToOne.

Nếu bạn có một thực thể người dùng mới (chưa tồn tại), bạn phải duy trì Người dùng có cascade = {"persist"} hoặc cascade = {"all"} trong trường tương ứng với thực thể Story. Bạn chỉ có thể lưu trữ đối tượng Story nếu User đã tồn tại và nó được gắn vào Doctrine.

Hy vọng điều đó sẽ hữu ích.

+0

Xin chào, tôi đã đính kèm các thực thể. Tôi đã kiểm tra lược đồ được tạo bởi học thuyết và tập hợp của nó. Nếu tôi lấy các chi tiết của thực thể câu chuyện tôi sẽ nhận được các chi tiết của thực thể người dùng như user_id là một khóa ngoài – Sujith

23

Bạn có thể vẫn là chủ thể câu chuyện chứ không phải là người dùng. Nếu bạn có một cái gì đó như thế này:

$story = new Story(); 
$user = new User(); 
$story->setUser($user); 
$em->persist($story); 
$em->flush(); 

này sẽ gây ra một lỗi nghiêm trọng, kể từ khi bạn đang kiên trì một tổ chức nào, nhưng thông qua các mối quan hệ của mình, Học thuyết tìm thấy một thực thể mới.Bạn có hai lựa chọn:

Gọi tồn tại trên cả hai thực thể:

$story = new Story(); 
$user = new User(); 
$story->setUser($user); 
$em->persist($story); 
$em->persist($user); 
$em->flush(); 

Hoặc thiết lập tầng kiên trì cho các thực thể Story. Ví dụ. nếu bạn đang sử dụng bản đồ chú thích, bạn sẽ làm cái gì đó như

/** 
* @ManyToOne(targetEntity="User", mappedBy="stories", cascade={"persist"}) 
*/ 
private $author; 

Chương 8. Working with associations chi tiết này.

+0

hi, tôi không muốn thực hiện các hoạt động liên tục trong bảng người dùng. Chỉ cần thực hiện trong câu chuyện entity.But if i lấy các chi tiết của thực thể câu chuyện Tôi sẽ nhận được các chi tiết của thực thể người dùng vì user_id là một khóa ngoài – Sujith

+4

Cùng một vấn đề đối với tôi. Thực thể Người dùng của tôi xuất phát từ một truy vấn kết quả được lưu trong bộ nhớ cache và do đó được mở. Tôi muốn tạo Câu chuyện mới mà không cần hợp nhất Người dùng để tạo là QUẢN LÝ. Đây là cơ bản những gì Sujith đang yêu cầu là tốt. Có cái gì đó giống như tham số "cascade = {ignore}" không? – andig

0

Dont bạn nghĩ rằng bạn nên đặt User hơn Userid cho câu trả lời story

$user = new User(); 
$user->setUserId($id); 
$story = new Story(); 
$story->setContent("...."); 
$story->setUser($user); //change here 
$this->em->persist($story); 
$this->em->flush(); 
3

K. Norbert của sự đáng tin cậy, nhưng có cái gì đó mà có thể không rõ ràng. Ít nhất là không rõ ràng đối với tôi, người đã đến học thuyết từ SQL.

Vấn đề là học thuyết dường như nhớ những đối tượng nào đã tồn tại. Bất cứ khi nào nó tìm thấy các đối tượng mới mới (chưa tồn tại) các đối tượng liên quan đến thực thể bạn muốn tồn tại - nó kêu với lỗi 'Một thực thể mới được tìm thấy thông qua mối quan hệ ...'. Khi bạn muốn lưu đối tượng mới (chỉ một thực thể, mà không có các thực thể liên quan đến sự bền bỉ), bạn chỉ cần đảm bảo rằng các thực thể liên quan đã được duy trì. Vì vậy:

$story = new Story(); 
$entityManager->find('User', $id); 
$story->setUser($user); 
$em->persist($story); 
$em->flush(); 

thực hiện thủ thuật. Bởi vì học thuyết biết người dùng đã tồn tại và nó không cần phải làm nữa. Doctrine biết vì chúng tôi có người dùng từ cơ sở dữ liệu.