Can not update array field in MYSQL - javascript

I am working with MYSQL via Sequelize and I created a field for an array. I read that I could do this with DataTypes of JSON in MYSQL and set the default value to []. I did this and I would like to update that field with string values. I have tried push like this:
category.dataValues.array_Of_food?.push('item1')
await category.save()
It won't save the added item in the database. If I use the update method like this:
await category.update({array_Of_food: category.dataValues.category_name})
This changes the array_of_food field with simply a string and not an array.
How do I simply push an item into the array field if this is possible?

I solved my problem by using this code:
category.update({ array_Of_food: Sequelize.fn(
'JSON_ARRAY_APPEND',
Sequelize.col('array_of_food'),
'$',
food.dataValues.food_Name
)})

Related

Check if firebase array contains value then get all data in that index

So I have an array in a firebase document called ActivityLikes. It looks like this:
The collection is like this below:
const db = fire.firestore();
db.collection("eventLikes")
.doc(eventID)
.set({
ActivityLikes: likes
})
I have another collection which has the word "Avoca" saved, and I have this right now and I basically want to pull the data that has "Avoca" in it. So like with the name "Avoca" i can also get the imgURL. I've tried a for loop to go inside the object that firebase returns but I guess my logic is due to the fact theres multiple value and key pairs inside of it so how would i get all of the data inside of index 1 because it has the name = "Avoca".
I have the activitylikes in a hook so I have it after calling it from firebase.
I've tried like:
for (var i=ActivityLikes.length; i--;) {
if (myArr[i].indexOf("Avoca")>=0) break;
}
I think my logic is off Im just not sure how to get all of the data inside of the index once the name matches
The other collection just looks like this: https://i.stack.imgur.com/TqhWd.png. I know how to call this from firebase, I just need to figure out the logic for getting all the data in the array in the ActivityLikes when the name "Avoca" is present
If you are looking just for the word "Avoca" then try using find():
// data is snapshot.data() after query
const avocaData = data.ActivityLikes.find(d => d.name === "Avoca")
Here avocaData will either be the first object from likes array where name is Avoca or undefined is there isn't any. After that you can use an if statement to check that and proceed with rest of the logic.

How to push an object in a object - javascript

I have two ways to fill the same hidden input in a form
Using an import CSV button
Adding data using another inputs
When I use the first option, the hidden input is filled with this
for example:
correct data
[{"url":"http://www.restaurant.com","businessTypeId":"1"},{"url":"http://www.hotel.com","businessTypeId":"2"}]
and works correctly if I store this data
but when I use the second option, the input is filled with this:
incorrect data
{"url":"http://www.google.com","businessTypeId":"3"}
That's incorrect because it doesn't have [brackets] at the beginning neither at the end
Another problem is when I insert data and fill that hidden input (with the first way) and then I try to add more data using the second way,
I get this
[{"url":"http://www.restaurant.com","businessTypeId":"1"},
{"url":"http://www.hotel.com","businessTypeId":"2"}],
{"url":"http://www.google.com","businessTypeId":"3"}
the first 2 data was inserted using the first way, the third data was inserted using the 2nd way
all data should be inside those brackets []
how can I "open" the brackets to push new data and "close" them?
at the beginning of all the code, the variable starts like this
let placesArray = [];
after the first method, data is inserted using this
placesArray.push(JSON.stringify(csvResult));
document.getElementById('places').value = placesArray;
them, after the second method, data is inserted using this
placesArray.push(JSON.stringify(placeData));
console.log('placeData datatable ' + placeData);
document.getElementById('places').value = placesArray;
Note: if I use the first method two times, brackets are duplicated, like this
[{"url":"http://www.restaurant.com","businessTypeId":"1"}
{"url":"http://www.hotel.com","businessTypeId":"2"}],
[{"url":"http://www.beauty-shop.com","businessTypeId":"3"},
{"url":"http://www.dentist.com","businessTypeId":"5"}]
I definitely need to "open" the object so that I can insert the new data and not go through this, how could I do that?
In the console.log, I have this for placeData [object Object], same result for csvResult, both are object
You could flatten the array before every value set
placesArray = placesArray.flat()
document.getElementById('places').value = placesArray;
Seems like csvResult is itself an array and as you stringify it and push it to placesArray, it doesn't look like the result you want.
I'd go with this instead
placesArray.push(...csvResult) // push each `csvResult` item into `placesArray`
document.getElementById('places').value = JSON.stringify(placesArray)
SOLVED:
I erased all JSON.stringify and added it to every line when I push data into inputs
like this
document.getElementById('places').value = JSON.stringify(placesArray);
in all lines when this is used.
thanks to #hgb123
for prevent to accumulate [brackets[more brackets]] I used .flat()
placesArray = placesArray.flat()
document.getElementById('places').value = JSON.stringify(placesArray);

How to prevent the sequelize from creating the output clause

When I do a create using sequelize it returns me the response i.e. the newly created entry row in the response,
Sequelize Create Object Code:
let createdObj= await sequelize.ModelName.create(modelObject,{ transaction :t, //more options can be added here, need some value of option that prevents the output inserted })
Below is the query created:
INSERT INTO [TABLE_NAME] ([COL1],[COL2],[COL3],[COL4]) OUTPUT INSERTED.* VALUES (#0,#1,#2,#3,#4)
Now I don't want the output clause to be part of the query, I want a simple insert like:
INSERT INTO [TABLE_NAME] ([COL1],[COL2],[COL3],[COL4]) VALUES (#0,#1,#2,#3,#4)
I don't want the output clause to be part of the query.
How can I achieve this in at the query level as well as at the model level? In some Create operations, I want the output clause and in some create operations, I don't want.
EDIT 1
On Further research I found an option called { returning: false } this does what is required i.e. create an insert query like this INSERT INTO [TABLE_NAME] ([COL1],[COL2],[COL3],[COL4]) VALUES (#0,#1,#2,#3,#4) but now the Sequelize is breaking because it's expecting those values back in return idk why?
C:\Users\MG265X1\project\node_modules\sequelize\lib\dialects\mssql\query.js:389
id = id || results && results[0][this.getInsertIdField()];
^
TypeError: Cannot read property 'id' of undefined
at Query.handleInsertQuery (C:\Users\MG265X1\project\node_modules\sequelize\lib\dialects\mssql\query.js:389:39)
Turns out if an autoIncrementAttribute is present in the model, it will look for the output clause, removing the attribute {autoIncrement: true } from the model hasn't helped as IDENTITY_INSERT cannot be null. How do I move ahead on this??
Edit 2 I could get it working with a combination of { returning: false } and {hasTriggers: true}. Have hasTriggers Attribute as true in your Model, this will allow you to single creates but for bulk Creates pass option returning: false at the time of bulkCreate.
Note: When using bulkCreate with { returning: false } you'll not be able to get the autogenerated Id, It's a trade-off that we had to live with as we want
bulkCreate to work with triggers, we ended up fetching the Id later from DB
Seems I raised this issue but was closed as it wasn't good SSCCE

array object with empty field name

In node-red i have array object in msg.payload.
the array object is [{"":"This Pallet ID is already in Pick Request List"}]
The array object has empty field name. please suggest how to retrieve value form the array.
I have tried msg.payload[0][0], msg.payload[0].Value. But not working
What you need is
var text = msg.payload[0][""];
Works in Chrome at least...

Insert data in Firebase in Reactjs

During storing an object to my firebase, I am expecting the structure as image below, but what I get was a generated running number as a key. This is my code to store an object to firebase
var location = [];
location.push({
ms_jhr_1 : {
name: value
},
...
});
const a = firebase.database().ref('Food/'+id);
a.set(location);
How do I keep my structure without generate the running number?
The problem is you are using an array to store your data and then setting that array in firebase. To get the expected result you have to modify your code a little bit.
Here use this and remove other code
const a = firebase.database().ref('Food/'+id);
a.set(ms_jhr_1);
So you just need to pass the object you want to store under that id and not the whole array.
Note:- If you want to store multiple entries under one id then you have to push all those entries in an Object and not in array.
So it will look something like this
var location = {};
Now use for loop to insert all your data into this object (Remember, you are adding objects inside an object). You don't need array. Because in firebase data is stored in JSON tree format.
Hope it helps.

Categories