как запросить отношения «многие ко многим» в одной таблице с помощью redbeanphp?

У меня есть таблица с именем «пользователь», и эта таблица имеет отношение «многие ко многим», например, любимое действие. это означает, что пользователь может добавить нескольких пользователей в избранное и может быть добавлен в избранное несколькими пользователями.

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

Я использую этот код:

$users = $agent->via($TB_Favorite,"agent_id=? and favorite.action=?", array($userId,FAVORITE_TYPE_USER_FAVORITE))->sharedUsers ;

Я отлаживаю этот код путем профилирования базы данных и получаю такой результат:

        SELECT
            `users`.*  ,
            COALESCE(
            NULLIF(`favorite`.`users_id`, `users`.id),
            NULLIF(`favorite`.`users2_id`, `users`.id)) AS linked_by
        FROM `favorite`
        INNER JOIN `users` ON
        ( `users`.id = `favorite`.`users2_id` AND `favorite`.`users_id` IN ('13') ) OR
        ( `users`.id = `favorite`.`users_id` AND `favorite`.`users2_id` IN ('13') )

но в этом случае он должен использовать favorite.agent_id вместо favorite.users2_id, как я могу решить эту проблему?

это моя табличная диаграмма: введите здесь описание изображения

может быть, это прояснит мою позицию.


person Navid_pdp11    schedule 23.08.2015    source источник


Ответы (2)


Хорошо, спасибо за схему и дополнительные пояснения. Итак, вы хотите запросить пользователей, связанных с любимыми действиями пользователя. Вот одно из возможных решений (проверено здесь на пустой БД):

$x = R::dispense(array(
'_type' => 'user',
'name' => 'Q',
'ownActivity' => array(
    array('_type'=>'favorite', 
         'name'=>'A', 
         'agent'=> array(
              '_type'=>'user', 
              'name'=>'X')),
    array('_type'=>'favorite', 
          'name'=>'B', 
          'agent'=> array(
              '_type'=>'user', 
              'name'=>'Y')),)));
R::store($x);
$me = R::findOne('user', ' `name` = ? ', array('Q'));
$favoriteActivities = $me->ownFavoriteList;
foreach($favoriteActivities as $activity) {
    $agent = $activity->fetchAs('user')->agent;
    $favoriteUsers[$agent->id] = $agent;
    echo $agent->name;
}
person Gabor de Mooij    schedule 25.08.2015
comment
этот код потрясающий...... но вы БОГ redbeanphp.... и вы знаете обо всех деталях этой библиотеки. мы бедны :) как мы можем помочь вам создать хорошую документацию? я думаю, что когда у redbeanphp будет хорошая документация, это будет самая популярная ORM для php. - person Navid_pdp11; 25.08.2015

Я не знаю точно, что вы имеете в виду, но, может быть, функция агр может чем-то помочь?

http://www.redbeanphp.com/other_relations#aggr

person Gabor de Mooij    schedule 23.08.2015
comment
Мне нужно, чтобы пользователи добавляли тег fav пространственному пользователю в моей «любимой» таблице, ведь у нее есть два внешних ключа с таблицей «user» - person Navid_pdp11; 23.08.2015
comment
Я искал и обнаружил, что у redbeanphp есть поддержка самореференции «многие ко многим», но я хочу знать, почему redbean принимает user2_id как столбец... и как изменить его на agent_id - person Navid_pdp11; 23.08.2015