База данных и запрос для хранения и получения списка друзей - PullRequest
2 голосов
/ 21 ноября 2011

Я разрабатываю модуль на веб-сайте для сохранения и получения списка друзей.Я использую Zend Framework и для обработки БД я использую Doctrine (ORM).

Существует две модели:

1) users , в которой хранятся все пользователи
2) my_friends , в которых хранится список друзей (чтоявляется справочной таблицей с отношением пользователя M: M)

структура my_friends следующая


... id ..........user_id ............ friend_id ........ утверждено ....
... 10 ......... 20 .................. 25 ................... 1 ..........
...10 ......... 21 .................. 25 ...................1 ..........
... 10 ......... 22 .................. 30 ................... 1 ..........
... 10 ......... 25 .................. 30 ................... 1 ..........


Doctrine запрос для получения идентификатора списка друзей после

$friends = Doctrine_Query::create()->from('my_friends as mf')
                                 ->leftJoin('mf.users as friend')
                                 ->where("mf.user_id = 25")
                                 ->andWhere("mf.approved = 1");  

Предположим, я просматриваю user no.- 25 .
С этим запросом Iя получаю только номер пользователя- 30 .
, где номер пользователя- 25 также одобренный друг номер пользователя- 20 и 21 .
Пожалуйста, ведите меня, что должен быть запрос, чтобы найти всех друзей и есть ли необходимость изменить структуру БД.

YAML
Член:
столбцы:

id:
  primary: true
  type: integer
  notnull: true
  autoincrement: true
userName:
  unique: true
  type: string(255)
Address_id:
  type: integer(4)
MemberPhoto_id:
  type: integer
 relations:
address:
  class: Address
  local: Address_id
  foreign: id
memberPhotos:
  class: MemberThumbnail
  foreignAlias: member
  local: MemberPhoto_id
  foreign: id

refPeeps:
columns:
id:
  primary: true
  unique: true
  type: integer
  autoincrement: true
Member_id:
  type: integer
  notnull: true
Peep_id:
  type: integer
  notnull: true
relations:
Member:
  local: Member_id
  foreign: id
Member:
  local: Peep_id
  foreign: id

Ответы [ 4 ]

0 голосов
/ 22 ноября 2011

- Привет, Амрит.

- Я думаю, тебе нужно получить данные двумя запросами.По моему мнению, вы должны выполнить следующие шаги:

  1. Сначала получите все данные с помощью запроса на соединение, соответствующего friend_id.
  2. И во второй раз вы применяете простой запрос для user_id и получаете данные.
  3. И затем получить данные, соответствующие второму запросу.
0 голосов
/ 21 ноября 2011

Я не знаю доктрины, ваш запрос, вероятно, это. если вы приведете пример данных и пример результата, я могу помочь лучше

SELECT *
FROM my_friend
LEFT JOIN users ON my_friend.friend_id = users.id
WHERE my_friend.user_id = 25
0 голосов
/ 21 ноября 2011

В соответствии с вашей таблицей, которая является выходом, вы должны получить

Поскольку вы запрашиваете user_id, а user_id = 25, есть только одна строка

У вас есть два способа сделать то, чтоВы хотите

1) Когда вы добавляете друга, вы должны создать две строки, одна из которых user_id = 25 и friend_id = 30, вторая user_id = 30 и friend_id = 25

Это немного уродливоно имеет преимущества при построении запросов

2) Второй способ не требует сохранения каких-либо изменений в базе данных, но требует изменения запроса. Вы должны запросить:

(user_id = 25 или friend_id = 25).Не только user_id

0 голосов
/ 21 ноября 2011

Я не уверен на 100%, как вы можете выразить это в Doctrine, поскольку я не использовал его некоторое время, но вам нужно присоединить my_friends к себе, где friend_id = user_id.Конечно, я могу неправильно понять структуру вашей базы данных.Если я вас неправильно понял, обновите ваш вопрос схемой PHP или файлом YAML, который его сгенерировал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...