fetch data from two tables and ignore the repeated values in laravel - mysql

I have two tables in laravel. table_2 have a foreign key i-e users_id so I want to fetch data from both tables and remove the duplicate entries. for that purpose I create two queries in my controller
$new=DB::table('tabl-1')
->join('tbl2','tbl1.id','=','tbl2.foreign_key')
->orWhereDate('created_at','<' ,Carbon::today())
->orWhereDate('created_at', Carbon::today())
->orWhereNull('created_at')
->select('tbl_1.created_at as date','tbl1.foreign_key as data_id')
->where('user_id',$users_id)
->get()
->toArray();
$old = DB::table('tbl-2')
->join('tbl1','tbl2.foreign_key','=','tbl1.id')
->where('user_id',$users_id)
->whereRaw('id IN (select MAX(id) FROM tbl2 GROUP BY foreign_key)')
->select('tbl_2.created_at as date','tbl2.foreign_key as data_id')
->get()
->toArray();
$data=array_merge($old,$new);
old array working fine but new array printing duplicate value of data.id , what should I do so I can get all data from old array but when moves in to new array it shows all rows except already show in old array

Related

Fetch data from same named two columns of two tables

I am trying to fetch data from 2 tables with a join query. Here I have 2 columns in 2 tables with same column name.
This is my query:
public function get_all_expenses()
{
$this->db->select("*",'category.name as cat_name');
$this->db->from('expense');
$this->db->join('category','expense.cat_id = category.id');
$this->db->join('users','expense.user_id = users.id');
$query = $this->db->get();
return $query;
}
I can fetch data of 1 column of 1 table. But I can't fetch data of another column of another table. I am using CodeIgniter.
According to the CodeIgniter documentation the database select method accept a single argument. The correct syntax for the select is then:
$this->db->select('*, category.name as cat_name');

Couldn't use the whereNotExists clause correctly in Laravel 8 Eloquent

I have 2 tables, one with different users, and the second table is an invoice table called "factures" and has a foreign key of userid, I called it client_id, which I am trying to get is the number of clients created_by a certain administrator and who have no invoices yet, here is what I tried:
$clients = User::select('id')
->where([['created_by',$membre_id],['role','Client']])
->orWhere([['updated_by',$membre_id],['role','Client']])
->whereNotExists(function($query)
{
$query->select(DB::raw('client_id'))
->from('factures')
->where('created_by',$member_id);
})->get();
but this query gives me all clients created_by $member_id without exception.
What is wrong with my query?
Did you try the following:
$clients = User::select('id')
->where(function($query) use($member_id){
$query->where([['created_by',$membre_id],['role','Client']])
->orWhere([['updated_by',$membre_id],['role','Client']])
})
->whereNotExists(function($query) use($member_id){
$query->select(DB::raw('client_id'))
->from('factures')
->where('created_by',$member_id);
})
->get();
}
This answer applied the OR condition only between the first two conditions (created_by and updated_by) and its result is AND with the third condition.

hasMany on Cakephp 4

I want to make a transaction with 1 transaction many products. but I have a problem only the last index entered on the product. is there a solution?this is my controller
[Model Table][2]
just make sure you are using an array on select query. to fetch all the records.
For eg,
$posts = $this->Employees->find("all")
->contain(["employeePosts" => function($q){
return $q->select(["id", "employee_id", "post_title"]);
}])
->toList();
echo print_r("posts");
here employee_id is a foreign key. and employeePosts is a key I created in EmployeesTable in hasMany()
$this->hasMany("employeeposts")->setClassName("Posts")

Laravel-Update another table with sum from one table

I want to get cumulative salary monthly(the table name is cumulative_salary) from another table(the table name is salary), then update the data. I just can 'get()' the data but i can't update. I'm so confusing and i don't know the correct syntax. So, this is my code.
$data = DB::table('salary')
->where('employee_id', $employee_id)
->leftJoin('employees', 'salary.employee_id', '=', 'employees.id')
->select(DB::raw('SUM(salary_overtime) as `salary`'),
DB::raw('YEAR(overtime_date) year, MONTH(overtime_date) month'))
->groupby('month','year')
->get();

How to fetch records from two different tables in laravel5.2

I have two tables 'approval' and 'renewal', both having a common column 'applicant_id'.
When new application comes-in, it stores a data-record in table 'approval' alongwith the 'applicant_id' for whom the record has been added.
Now, when there is a renew applied for that same applicant, the row gets created in the table 'renewal' referencing the 'applicant_id'
Note: There can be a single record in the table 'approval' for a 'applicant_id' but there can be more than one record for the same 'applicant_id' in the table 'renewal'.
Now, my requirement is:
I need to fetch the records from both the table for all the applicants.
Conditions: If there is a data for the 'applicant_id' in both the table and 'renewal' table has multiple row for the same 'applicant_id', then I need to get the records from 'renewal' table only that too the latest one.
If there is no data in 'renewal' table but exists in 'approval' table for the 'applicant_id', then the fetch record should get the data present in 'approval' table.
Basically, if there is record for the applicant in 'renewal' table, get the latest one from there, if there is record present only in 'approval' table, then get that one but the preference should be to get from 'renewal' if exists.
I am trying to do this in laravel 5.2. So, is there anyone who can help me in this?
If you're using Eloquent, you'll have 2 models:
Renewal.php
<?php
namespace App;
use Illuminate\Eloquent\Model;
class Renewal extends Model
{
protected $table = 'renewal';
public static function findMostRecentByApplicantId($applicantId)
{
$applicant = self::where('applicant_id', '=', $applicantId)
->orderBy('date_created', 'desc')
->first();
return $applicant;
}
}
Approval.php
<?php
namespace App;
use Illuminate\Eloquent\Model;
class Approval extends Model
{
protected $table = 'approval';
public static function findByApplicantId($applicantId)
{
$applicant = self::where('applicant_id', '=', $applicantId)
->first();
return $applicant;
}
}
Then, in the code where you want to get the approval/renewal record, use the following code:
if (! $record = Renewal::findMostRecentByApplicantId($applicantId)) {
$record = Approval::findByApplicantId($applicantId);
}
//$record will now either contain a valid record (approval or renewal)
//or will be NULL if no record exists for the specified $applicantId
After few try, I got one way to do it using raw:
SELECT applicant_id, applicant_name, applicant_email, applicant_phone, renewed, updated_at
FROM (
SELECT renewal_informations.applicant_id, renewal_informations.applicant_name, renewal_informations.applicant_email, renewal_informations.applicant_phone, renewal_informations.renewed, renewal_informations.updated_at
FROM renewal_informations
UNION ALL
SELECT approval_informations.applicant_id, approval_informations.applicant_name, approval_informations.applicant_email, approval_informations.applicant_phone, approval_informations.renewed, approval_informations.updated_at
FROM approval_informations
) result
GROUP BY applicant_id
ORDER BY applicant_id ASC, updated_at DESC;
For every single Approval id, there can b multiple records for renewal table suggests you have One to Many relation. which you can define in the your Model like
Approval.php (App\Models\Approval)
public function renewal()
{
return $this->hasMany('App\Models\Renewal', 'applicant_id')
}
Having defined this relation. you can get the records from the table using applicant_id.
$renewal_request_records = Approval::find($applicant_id)->renewal();
This will get all records from renewal table against that applicant_id.
Finding the latest
$latest = Renewal::orderBy('desc', 'renewal_id')->first();
Further Readings Eloquent Relations