i darle una oportunidad a responder a mi pregunta, soy todavía bastante difuminar con esto, espero que alguien realmente puede dar una mejor respuesta,
por lo primero responder a la pregunta ABT ¿cómo derivo con $friendsWithMe
básicamente, comencé con la "decodificación" de una relación bidireccional más simple, más común, de muchos a muchos.
- 1 usuario puede estar en muchos grupos
- 1 grupo puede tener muchos usuarios
muy directo. pero, ¿cómo tiene sentido esto en SQL?
código para implementar
# select groups user is in
select group_id from users_groups
where user_id = 1
#select users of group
select user_id from users_groups
where group_id = 1
ahora al modelo real ... en SQL
en el código
# select friends of given user
# $user->myFriends
select friend_id from friends
where user_id = 1;
# select users that are friends of given user
# $user->friendsWithMe
select user_id from friends
where friend_id = 1;
¡ah, ja! selecciona usuarios que son amigos del usuario dado. entonces así es como obtengo $friendsWithMe
. luego para completar el inversedBy
& mappedBy
& el resto de la clase?
1ª mirada a la nota inferior.
no está claro sin tanto y el pensamiento profundo, ABT 2 días. Supongo
y luego, como práctica, ¿cómo puedo crear una relación de autoreferencia de muchos a muchos desde cero?
el ejemplo en el que voy a trabajar es ... hmm, bastante asqueroso, pero creo que lo intentaré :) ... 1 usuario/alumno puede tener muchos profesores. 1 maestro puede tener muchos usuarios/estudiantes. 1 usuario puede ser profesor y alumno aquí. Como en foros como estos, cuando respondes preguntas de alguien, eres un profesor. cuando usted pide, u es un estudiante
el ERD se verá como
algo de código para seleccionar, los estudiantes de los maestros, los maestros de estudiantes
# select students of teacher
# $teacher->students
select student from teacher_student
where teacher = 1;
# select teachers of student
# $student->teachers
select teacher from teacher_student
where student = 2;
ok, la parte doctrina ?
/** @Entity @Table(name="users")) */
class User {
/**
* @Id @Column(type="integer")
* @GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @Column(type="string", length="30")
*/
private $name;
/**
* @ManyToMany(targetEntity="User", inversedBy="teachers")
* @JoinTable(name="Teachers_Students",
* joinColumns={@JoinColumn(name="teacher", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="student", referencedColumnName="id")}
* )
*/
private $students;
/**
* @ManyToMany(targetEntity="User", mappedBy="students")
*/
private $teachers;
}
que generó este mesas para mí
# users
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
#teachers_students
CREATE TABLE `teachers_students` (
`teacher` int(11) NOT NULL,
`student` int(11) NOT NULL,
PRIMARY KEY (`teacher`,`student`),
KEY `student` (`student`),
CONSTRAINT `teachers_students_ibfk_2` FOREIGN KEY (`student`) REFERENCES `users` (`id`),
CONSTRAINT `teachers_students_ibfk_1` FOREIGN KEY (`teacher`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
al fin lo he hecho! vamos a probarlo ... erm que estoy recibiendo
Fatal error: Class 'Entities\User' not found in D:\ResourceLibrary\Frameworks\Doctrine\tools\sandbox\index.php on line 61
cuando intento hacer una zzz
$user = new User;
...
también he blogged ABT esta pregunta y mi explicación en mi tumblr
$ user = usuario nuevo(); – ruipacheco
+1 Para mayor claridad de la pregunta y el esfuerzo en la preparación de material fuente adicional – calumbrodie
Hola. Tengo un problema con la doctrina con estas relaciones. Cuando agrego elementos a ese tipo de colección, limpio y después de eso los elimino a todos y vuelvo a descargar. Estoy recibiendo 'La clase 'Doctrine \ ORM \ Persisters \ ManyToManyPersister' no se encontró en la cadena de espacios de nombres configurados'. Cuando elimino elementos, pero dejo al menos uno, todo funciona perfectamente. ¿Puedes probar este comportamiento por mí? y si no recibes ningún problema después de la versión de la doctrina que estás usando? Estaré agradecido. –