Add attributes to ActiveRecord from fieldTable - activerecord

I have an Yii project, where I want to add fields on the profile page, which are described in another model.
So the table could look like this:
CREATE TABLE `object_field` (
`id` INT NOT NULL AUTO_INCREMENT ,
`varname` VARCHAR(255) NULL ,
`title` VARCHAR(255) NULL ,
`field_type` VARCHAR(255) NOT NULL ,
`match` VARCHAR(255) NULL ,
`range` VARCHAR(255) NULL ,
`default` VARCHAR(255) NULL ,
`required` INT(1) NOT NULL DEFAULT 0 ,
`position` INT(3) NOT NULL DEFAULT 0 ,
`visible` INT(1) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB
So in the UserProfile-model, I have added the fields to the rules() and attributesLabels() but the __get() and __set() does can't find the attributes before I add e.g. public $this->fieldName to model.
The values to the user is stored in another table, which connects the User with the UserData
Should I overwrite the __get() and __set() in the model, or how can I make my fields to the form accept using dynamic defined fields?
Update:
I have looked at the Yii-user extension, http://www.yiiframework.com/extension/yii-user/, but it does just change the UserProfile-schema to add the new fields. I could have 20 different types of users, and each of them shares some fields and maybe have some special fields just for the one type.
A solution could be to add the mongoDB as a relation. But I have never worked with that technology.

Related

Display the page title dynamically

I've an existing CodeIgniter Application with lot of pages where all the page titles( h1 tag ) are hard coded in the views. Now I'm looking to populate the titles dynamically from the below table structure with as much less effort as possible.
CREATE TABLE `page_title` (
`id` int(11) NOT NULL,
`page_no` tinytext NOT NULL,
`page_title` varchar(255) NOT NULL,
`date` tinytext NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `page_title`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
Need suggestion on how to display the title with a good approach. I was thinking to create a common model and call the model in the view with page_id pass to get the page_no and page_title for that id.

Laravel - Is it possible to make relation between models (belongsTo) via an element of array as text in table

I'm absolute beginner in Laravel.
Is it possible to make relation, say belongsTo between models via an element of array.
Column in table1 like this:
mapping: ["misc","rates","photos"]
I need something similar to following:
public function dependencies() : BelongsTo
{
// This is impossible because "mapping" is array in Depends model and text type in database.
return $this->belongsTo(Depends::class, 'mapping', 'element_of_array');
}
or something similar (hasMany etc).
Table looks like this:
CREATE TABLE `dependings` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`media_id` int(10) unsigned NOT NULL,
`type` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL,
`mapping` text COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `dependent_collection_mappings_collection_id_type_unique` (`media_id`,`type`),
CONSTRAINT `dependent_collection_mappings_collection_id_foreign` FOREIGN KEY (`media_id`) REFERENCES `media` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

yii2 : can't get data from two table with active record

I want get data from two table comments,users.
comments have hasOne relation with users
public function getUser()
{
return $this->hasOne(Users::className(), ['user_id' => 'user_id']);
}
i want get comments.comment_id,comments.comment_content,comments.user_id from comments table and uses.user_name , users.user_display_name from users table to use in gridview widget.
i use
$res = Comments::find()
->select([
'comments.comment_id',
'comments.comment_content',
'comments.user_id',
'users.user_id',
'users.user_display_name',
'users.user_name',
])
->innerJoinWith('user')
->all();
this code get comments field but i can't get users.user_name,users.user_display_name from database.
How should I do it?
note: user table in database is users but when i create model with Gii,relation method declare as getUser(), i don't know why.
update 1:
comments table:
DROP TABLE IF EXISTS `comments`;
CREATE TABLE `comments` (
`comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`comment_content` text NOT NULL,
`comment_approved` enum('no','yes') NOT NULL DEFAULT 'no',
`comment_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`comment_parent` bigint(20) unsigned NOT NULL DEFAULT '0',
`sms_id` bigint(20) unsigned NOT NULL DEFAULT '0',
`user_id` bigint(20) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`comment_id`),
KEY `fk_comment_sms_id` (`sms_id`),
KEY `fk_commetn_user_id` (`user_id`),
CONSTRAINT `fk_comment_sms_id` FOREIGN KEY (`sms_id`) REFERENCES `sms` (`sms_id`),
CONSTRAINT `fk_commetn_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
users table:
CREATE TABLE `users` (
`user_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`user_name` varchar(60) NOT NULL DEFAULT '',
`user_pass` varchar(64) NOT NULL DEFAULT '',
`user_level` int(11) NOT NULL DEFAULT '1',
`user_email` varchar(100) NOT NULL DEFAULT '',
`user_display_name` varchar(250) NOT NULL DEFAULT '',
`user_phone_number` varchar(11) NOT NULL,
`user_registered` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`user_activation_key` varchar(60) NOT NULL,
`user_status` enum('active','deactive','delete') NOT NULL DEFAULT 'deactive',
PRIMARY KEY (`user_id`),
UNIQUE KEY `u_user_sign` (`user_name`) USING BTREE,
UNIQUE KEY `u_user_email` (`user_email`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8;
Not sure how you're displaying or testing if the query returned any data but you should read up on relations in Yii.
Working with Relational Data
Lazy and Eager Loading
With lazy loading the data doesn't exist until you try to access it so may not appear in things like print_r or var_dump
I recommend renaming your tables to comment and user. Read here: Table Naming Dilemma: Singular vs. Plural Names why you should use singular names.
The reason Gii generates getUser and not getUsers is because of the hasOne relationship. It's getting one -user- and not multiple -users-
Are you sure the relationship definition is correct? Is user_id the PK in the users table and the FK in the comments table? And are you sure there is correct data in the DB?

CodeIgniter dependencies between models, without using any ORM or DataMapper systems

I'm writing a CRUD system using CodeIgniter, implementing some 'one to many' dependencies between models (without using any ORM or DataMapper systems) by calling methods from one model to another.
For example: in a "many Documents per User" realeation, when deleting a User, the User_Model directly calls the delete() method on the Document_Model, deleting any documents associated with it.
I’m certain there’s a better way implementing 'one to many' model releation (without ORM, etc.. ), and would appreciate some guidance.
Thanks
Alon.
Of course! You are allowed to use InnoDB engine. This engine has functionally foreign keys, so you can do smth like that, for example (very basic)
CREATE TABLE IF NOT EXISTS `documents` (
`did` bigint(11) NOT NULL AUTO_INCREMENT,
`uid` bigint(11) NOT NULL,
`data` varchar(255) NOT NULL,
PRIMARY KEY (`did`),
KEY `uid` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `user` (
`uid` bigint(11) NOT NULL AUTO_INCREMENT,
`name` varchar(25) NOT NULL,
`password` varchar(25) NOT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
ALTER TABLE `documents`
ADD CONSTRAINT `documents_cstr_1` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON DELETE NO ACTION ON UPDATE CASCADE;

Jasper Report parameter returns wrong results

I'm writing a report to get result from mysql database. The query has one parameter which is of type int in mysql database. I define a parameter of type java.lang.Integer but when I run the report and give it a value it doesn't return any data. I tried to change the parameter type to String, then I got incorrect results. Here is the report query:
SELECT
orders.`number` AS orders_number,
orders.`length` AS orders_length,
orders.`thick` AS orders_thick,
orders.`date` AS orders_date,
orders.`weight` AS orders_weight
FROM
`orders` orders
WHERE
orders.`customer_id` = $P{cust_id}
and here is the Order table schema:
CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`customer_id` int(11) DEFAULT NULL,
`number` double DEFAULT NULL,
`length` double DEFAULT NULL,
`thick` int(11) DEFAULT NULL,
`weight` double DEFAULT NULL,
`date` date DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `customer_fk` (`customer_id`)
) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8$
Thanks,
Try switching the $P{} syntax for $P!{}. As in,
WHERE
orders.`customer_id` = $P!{cust_id}
Jasper usually works by converting the query to a java PreparedStatement object, then setting the parameters using the object's methods. The $P!{} syntax will do the parameter substitution before the query is converted to an object.

Resources