How to get attributes of relations through query in Strapi - database

I am using Strapi's entity service to get data for all attributes including the relations attributes till the deepest relation.
But following is providing me the data of only one level deep relation's attributes. How can I get all the deepest relations attributes?
const entries = await strapi.entityService.findMany(api::name.name, {
populate: '*'
});

If you really want the deepest level of population, you have to write out each element. There are community solutions out there that work just with the '*', but they don't work reliably for me.
But you can try them out anyways if you want to: https://market.strapi.io/plugins/strapi-plugin-populate-deep

Related

Connection attributes in firebase query React

I would like to get books from Firebase where author or title is given with React. Sth like that :
fire.firestore().collection('books').where('name OR author', '==', elFromMyState).
get().
then(snapshot => {
snapshot.forEach(doc => {
let element = doc.data();
array.push(element)
})
setBooks(array);
props.setList(array);
})
but don't know how to do it correctly
Unfortunately, firebase provides limited support for logical OR queries.
You can specify multiple value comparisons (logical OR's) for the same field. For example, looking for either Poland OR Austria in a neighboringCountries field.
You cannot specify multiple fields against which you query a single value. For example, looking for the value Nikola Tesla on fields people OR inventors.
The limitations are explained in more detail in the firebase docs: https://firebase.google.com/docs/firestore/query-data/queries#query_limitations
They explain that in order to work around this, you execute two independent queries, then combine the results on the front end for display.

Retreiving nested json or a tree from ArangoDB

ArangoDB is great for retrieving a graph of data. A tree is a kind of graph.
We want to store data of buildings in a database. The structure of a building can be thought of as a hierarchy of parts.
The data structure is very simple: assemblies containing other assemblies, unlimited levels deep.
Assemblies are stored as documents, and linked by an edge collection contains.
The data that I need, can be fetched with
FOR v, e, path IN 1..3 OUTBOUND
'assemblies/14810426' contains
RETURN path
The data is there, however, I want to have a json like
{name: "Office Building",
assemblies: [{name: "Director's office",
assemblies: [{name: "Chair"}, {name: "Desk"}]},
{name: "Toilet}]}
Is there a way to get this format straight from ArangoDB, or do I need to write code myself to convert the graph path to a tree?
I guess writing a Foxx service is an option, but I would like to avoid that.
There is a similar question, with answer, but that was for the previous version of ArangoDB. It requires a bit of foxx code. I was hoping to have a solution, straight from AQL.
You could make use of subquery to aggregate results and add it to your return result.
AQL Query like this
FOR doc IN assemblies
FILTER doc._id=='assemblies/14810426'
LET conn_docs=(
FOR v,e,path IN 1..3
OUTBOUND doc contains RETURN {'name':v.name}
)
RETURN {'name':doc.name,'assemblies':conn_docs}
would do the task, which aggregates the connected assemblies to a query doc and place those in the return result
I know you want to avoid Foxx, but if interested I've answered this for someone else who wanted to have recursive nesting for menu trees.
Have a look at my answer for Arangodb AQL recursive graph traversal
for more info.

CakePHP 3 Entity Confusion

Here is the issue I am facing all the time since I started to learn CakePHP 3
What is this concept of entity a real world example would help alot.
public function add()
{
// why do we have to create new entity / what is the role of entity here.
$comment = $this->Comments->newEntity();
if ($this->request->is('post','put')) {
// why do we have to use this line after posting / what is the role of this line.
$comment = $this->Comments->patchEntity($comment,$this->request->data);
if ($this->Comments->save($comment)) {
$this->Flash->success('comment submitted successfully.');
} else {
$this->Flash->error('Sorry, comment could not be updated.');
}
}
return $this->redirect($this->referer());
}
Let me open the book for you:
While Table Objects represent and provide access to a collection of
objects, entities represent individual rows or domain objects in your
application. Entities contain persistent properties and methods to
manipulate and access the data they contain.
-
why do we have to create new entity / what is the role of entity here.
Almost everything, if not all, in Cake3 works with entities, what an entity is is explained above. You need to create a new entity so that the FormHelper can work with it, AFAIR it can still work with an array if configured to do so as well but the entity should be used.
The reason entities exist is to abstract the data. Some people think entities are the representation of a DB row - that's wrong. As the book says, they can be a row but don't have to represent a row because the 3.0 ORM can work with other resources as well. In theory you can have a CSV data source that returns an entity per line.
I suggest you to read the entity code in the CakePHP core to get a deeper understanding of what else entities provide, just saying they're "just" a set of properties is to short thought.
why do we have to use this line after posting / what is the role of this line.
The post data is merged into the previously created entity, that's it. Use the API if you have basic questions like that. See the API entry for patchEntity().
In simple word, Entity is a set of one record of table and their relational table, on that you can perform operation without touch of database and encapsulate property of entity (fields of table) as you want.
Advantages of Entity.
Modifying result sets outside of the database (for formatting or otherwise)
Needing to represent both the table and row in the same class.
Data validation was a fucking nightmare.
Inconsistent API in terms of both how we handled things internally as well as what (and how) we returned stuff.
Other random stuff as you want.
You can do run-time modification of result sets. Just add a method to your entity to return results in the way you want. This also means you can use composition for managing entities (yaya traits)
Validation is beautiful. We can validate data before it gets into an object and then validate the object state in a separate step.
It is easier for developers to understand what they are dealing with. You either have an object or an array of objects. An object can be linked to data which can also include other objects, but you no longer have to guess at what the array key will be, nor whether its nested funkily.
We can iterate on the interface for tables and entities separately. We couldn't easily change internals for the old Model class because of the implications on both, whereas now we can (in theory) change one without mucking about in the other.
It looks prettier simple.
Try this:
if ($this->request->is('post','put')) {
$data = $this->request->getData();
$comment = $this->Comments->newEntity();
$comment = $this->Comments->patchEntity($comment, $data);
$status = $this->Comments->save($comment);
if ($status) {
$this->Flash->success('comment submitted successfully.');
} else {
$this->Flash->error('Sorry, comment could not be updated.');
}
}
return $this->redirect($this->referer());
}
My advice is never use Post and Put in the same function. Just for good pratice. Put works fine when you make a update using id like a parameter.

ModX Revo Database: Relation between member groups and document groups

I'm creating some custom queries and need to figure out the relation between Member Groups and Document Groups.
My ultimate goal is to display the resources belonging to a particular User Group when a user log in. I am able to get their User ID from Sessions and so the relations I have figured out so far are:
User ID -> Member Groups Table -> ??Unknown table that pairs Member Groups with Document Groups?? -> Document Groups Table- > Resources Table
I just cant find that missing table(s)!
If any one can help me out that would be awesome!
Thanks
(ps: using Revo)
EDIT: added image for assitance
You could use some of the built-in MODX methods to achieve this.
This is not tested and might not work, but this might be a way to do it:
// userGroups = membergroups
$userGroups = $user->getUserGroups();
foreach ($userGroups as $userGroup) {
$resGroups = $userGroup->getResourceGroups();
foreach ($resGroups as $resGroup) {
$resources = $resGroup->getResources();
// merge resources into an array or something
}
}
Check out moduser.class.php, modusergroup.class.php, and modresourcegroup.class.php to see the queries behind these methods. You might be able to adapt them to one more efficient query.
Also, if I haven't misunderstood what you want to achieve then your results should be similar to what a user would see in the resource tree in the manager when logged in?
That uses the resource/getnodes.class.php processor, which retrieves all possible resources for each context using getCollection, then loops through each and decides whether to display or not by using $resource->checkPolicy('list'). That might be another approach to consider.
I usually work with custom data rather than MODX resources so would be keen to hear how you get on with this.
I know this is really, really old, but I came across this question looking for the answer myself. After a bit more digging I've found that it's the access_resource_groups table that links document_groups and member_groups
document_groups.id = access_resource_groups.target
member_groups.id = access_resource_groups.principal

Find CouchDB docs missing an arbitrary field

I need a CouchDB view where I can get back all the documents that don't have an arbitrary field. This is easy to do if you know in advance what fields a document might not have. For example, this lets you send view/my_view/?key="foo" to easily retrieve docs without the "foo" field:
function (doc) {
var fields = [ "foo", "bar", "etc" ];
for (var idx in fields) {
if (!doc.hasOwnProperty(fields[idx])) {
emit(fields[idx], 1);
}
}
}
However, you're limited to asking about the three fields set in the view; something like view/my_view/?key="baz" won't get you anything, even if you have many docs missing that field. I need a view where it will--where I don't need to specify possible missing fields in advance. Any thoughts?
This technique is called the Thai massage. Use it to efficiently find documents not in a view if (and only if) the view is keyed on the document id.
function(doc) {
// _view/fields map, showing all fields of all docs
// In principle you could emit e.g. "foo.bar.baz"
// for nested objects. Obviously I do not.
for (var field in doc)
emit(field, doc._id);
}
function(keys, vals, is_rerun) {
// _view/fields reduce; could also be the string "_count"
return re ? sum(vals) : vals.length;
}
To find documents not having that field,
GET /db/_all_docs and remember all the ids
GET /db/_design/ex/_view/fields?reduce=false&key="some_field"
Compare the ids from _all_docs vs the ids from the query.
The ids in _all_docs but not in the view are those missing that field.
It sounds bad to keep the ids in memory, but you don't have to! You can use a merge sort strategy, iterating through both queries simultaneously. You start with the first id of the has list (from the view) and the first id of the full list (from _all_docs).
If full < has, it is missing the field, redo with the next full element
If full = has, it has the field, redo with the next full element
If full > has, redo with the next has element
Depending on your language, that might be difficult. But it is pretty easy in Javascript, for example, or other event-driven programming frameworks.
Without knowing the possible fields in advance, the answer is easy. You must create a new view to find the missing fields. The view will scan every document, one-by-one.
To avoid disturbing your existing views and design documents, you can use a brand new design document. That way, searching for the missing fields will not impact existing views you may be already using.

Resources