У меня есть две коллекции. (applyJobs
и Jobs
и users
). Когда пользователи подают заявку на работу, я сохраняю эту запись в коллекции applyJobs
. Вот так:
applyId:****,
jobId:*****,
userId:*****
Теперь я хочу показать все заявки на вакансии пользователя. Первый: получить идентификатор зарегистрированного пользователя, я храню локально зарегистрированный идентификатор пользователя. Таким образом, я могу получить зарегистрированный идентификатор пользователя.
Второе: я фильтрую Apply Jobs по этому идентификатору. вот так var ref = _db.collection('applyJobs').where('userId',isEqualTo: uid);
. Я здесь я не назвал users
коллекцию, чтобы получить UID. потому что я уже храню UID локально. Это лучшая практика?
Третье: я сохраняю результат здесь List<ApplyJobsModelClass>
. Я хочу получить все вакансии по списку идентификаторов. Как мне это отфильтровать?
Вот так я и попробовал. Но это не список идентификаторов. только один идентификатор.
streamApplyJob(List<String> jobId) {
Collection('jobs').document(jobId);
}
И я тоже так пробовал.
Stream<List<JobModel>> streamApplyJob(List<String> jobId) {
var ref = _db.collection('jobs').where('jobId',isEqualTo: jobId);
return ref.snapshots().map((list) =>
list.documents.map((doc) => JobModel.fromFirestore(doc)).toList());
}
пытался получить длину, но результат 0
db.streamApplyJob(jobIds).listen((v)=>{
print(v.length)
});
Полный код
Сторона базы данных
///Get a stream of apply jobs
Stream<List<ApplyJobModel>> streamApplyJobs(String uid) {
var ref = _db.collection('applyJobs').where('userId',isEqualTo: uid);
return ref.snapshots().map((list) =>
list.documents.map((doc) => ApplyJobModel.fromFirestore(doc)).toList());
}
///Get a stream of a single document
Stream<List<JobModel>> streamApplyJob(List<String> jobId) {
var ref = _db.collection('jobs').where('jobId',isEqualTo: jobId);
return ref.snapshots().map((list) =>
list.documents.map((doc) => JobModel.fromFirestore(doc)).toList());
}
вызов
List<String> jobIds = [];
void getData() {
db.streamApplyJobs(widget.uid).listen((listApplies) => {
for (int i = 0; i < listApplies.length; i++)
{jobIds.add(listApplies[i].jobId)},
});
db.streamApplyJob(jobIds).listen((v)=>{
print(v.length)
});
}
Решение (это работает сейчас) - это лучшая практика илиЕсть ли другой лучший способ сделать это?
Future<List<JobModel>> getJobs() async {
await db.streamJobs(true).listen((jobs) {
setState(() {
jobModel = jobs;
});
});
return jobModel;
}
Future getData() async {
await getJobs();
db.streamApplyJobs(widget.uid).listen((apply) => {
for (int j = 0; j < jobModel.length; j++)
{
for (int i = 0; i < apply.length; i++)
{
if (apply[i].jobId == jobModel[j].jobId)
{
jobModelNew.add(jobModel[j]),
}
}
}
});
}