Soft delete on a intermediate table for many-to-many relationship - laravel

How do I set soft delete on an intermediate table which is connecting two different types of entities? I've added deleted_at column, but the docs say that I need to put this into the model:
protected $softDelete = true;
Of course, I don't have a model for an intermediate table.
Any idea?

You can put a constraint on the Eager Load:
public function groups()
{
return $this
->belongsToMany('Group')
->whereNull('group_user.deleted_at') // Table `group_user` has column `deleted_at`
->withTimestamps(); // Table `group_user` has columns: `created_at`, `updated_at`
}
Instead of HARD deleting the relationship using:
User::find(1)->groups()->detach();
You should use something like this to SOFT delete instead:
DB::table('group_user')
->where('user_id', $user_id)
->where('group_id', $group_id)
->update(array('deleted_at' => DB::raw('NOW()')));

You could also use Laravel's Eloquent BelongsToMany method updateExistingPivot.
$model->relation->updateExistingPivot($relatedId, ['deleted_at' => Carbon\Carbon::now()]);
So to use #RonaldHulshof examples you have a User model with a groups relationship which is a belongsToMany relationship.
public function groups() {
return $this->belongsToMany(Group::class)->whereNull('groups_users.deleted_at')->withTimestamps();
}
Then in order to soft delete the pivot table entry you would do the following.
$user->groups()->updateExistingPivot($groupId, ['deleted_at' => Carbon\Carbon::now()]);

As far as I understand it; an intermediate table is simply a length of string attaching one tables record to a record in another table and as such it does not require a soft delete method.
To explain, imagine you have a Users table and a Groups table, each user can have more than one Group and each Group can belong to more than one User. Your pivot table may be User_Group or something like that and it simply contains two columns user_id and group_id.
Your User table and Group table should have a deleted_at column for soft deletes, so when you "delete" say a Group, that group association will not appear in $User->Groups() while the pivot table row has remained unaffected. If you then restore that deleted Group, it will once again appear in $User->Groups().
The pivot table row should only be affected if that group record is hard deleted, in which case the pivot rows should also be hard deleted.
Now I have explained why I do not believe you need to add soft delete to a pivot table; is there still a reason why you need this behavior?

Related

laravel eloquent ORM Joint multiple table without Foreign key And Multiple model

I have two tables. One is user and the other is category, I have written this Eloquent ORM query to retrieves data from category
$category = Category::where(['status'=>'active'])->orderBy('id','asc')->get();
In category table here has a field called user_id. I want to join the user table and want to retrieve the user name where category table 'user_id' == user table 'id'.
How can I do this in Laravel eloquent ORM without Foreign key And Multiple models.

Query on Latest records out of multiple records in a Laravel Relation

I have two table users and users_logs .
The users_logs table is linked with users by user_id.
The users_logs table may have multiple entries against different users, like 100 records may have against one user_id.
I want to fetch all users from users table and then want to check if the last (the latest entry) in users_logs table has created_at smaller than the certain date, if yes, then fetch that records else not.
i have also created a hasMany relation in users table.
public function users_logs_details(){
return $this->hasMany('App\UsersLog', 'user_id', 'id');
}
The code i tried is
$users = User::with(['users_logs_details'])
->whereHas('users_logs_details', function($query) use ($certainDate) {
return $query->where('created_at', '<', $certainDate);
})->get();
But i am not getting any result because, this query is checking in all records in users_logs table, but i want to check only the latest record.
Please help, i would be highly thankful.

how to get data from pivot table inside a many to one relation in laravel 5.6

I have 3 tables name like "product" , "user", "product_type" so in my case user and product_type having many to many relationship and user and product having one to many relationship and product and product_type having one to one relationship.
I create one pivot table for user and product_type. inside that pivot table, I added one more column for description. so in product listing page I need to display description from that pivot table.
My code look like this:
Product::with('user)->with('product_type')->get();
To get extra fields from pivot table you need to use withPivot in function of your model Like this:
public function product_type() {
return $this->belongsToMany('App\Product','product_type','product_id','user_id')->withPivot('column1', 'column2');
}
you may also refer laravel docs for it:
https://laravel.com/docs/5.7/eloquent-relationships

Pivot table but not using table id

Is it possible to make a Pivot Table without using table id?
users
id
biometric_id
first_name
last_name
attendances
id
biometric_id
date
emp_in
emp_out
user_attendances
user_id
attendances_biometrics_id
I wanted to ask if this is available to link it like this? Because I need to show the attendance of the user that has his biometrics.
If it is possible, how?
If attendances.biometric_id has a unique constraint on it then there should be no reason why you cannot use it as a foreign key constraint.
Assuming your tables have been setup properly with foreign key constraints, your user model would probably have something like this:
public function attendances() {
return $this->belongsToMany('App\Attendances', 'user_attendances', 'user_id', 'attendances_biometrics_id');
}

How to create a one-to-many relationship in Eloquent to a table without creating a model for that table?

I have a model which holds a property with zero to many values. Those values are strings (e-mail addresses). But I don't want to create an extra model for such values since they only appear in this property.
As far as I read the docs I need to have a model for my e-mail addresses to gain full power of Eloquent.
Am I missing something out or is there no clean way to spare a model for a database table for relationships?
A short example of my database tables in question:
Table A:
- id [serial]
- name [string]
- someProperty [string]
- mailAddresses [unsigned int; reference to id of Table B]
Table B:
- id [serial]
- mail [string]
I've got a model for Table A:
class ModelA extends Eloquent {
protected $table = 'Table A';
public function mailAddresses() {
return $this->hasMany('<what to put here?>');
}
}
Bascially, you have 1 Model for 1 Database Table (except the Table is an intermediate table (pivot table)).
So shortly, yes. If you want Eloquent Models to work properly, you need to create a Model for your E-Mail Table.

Resources